问了一个问题(对不起,我的英语可能是随机的)
我需要导入sensorName.hpp文件中已知的“ decoding()”函数,但是由于传感器列表可能会随时间变化,因此我必须将其名称存储在向量中(sensor1 id,name1,name2,sensor2 id ,name2等)。我知道我需要在nameX.hpp中调用nameX :: decoding(),(nameX表示传感器X),但我只通过字符串知道nameX,而且我想我不能只是将它连接成字符串“ .hpp”,希望它能正常工作。
这是我的代码:
void decoding(string data, std::vector<string> ids)
{
//reading data to determine the sensor
string id = data[0] + data[1]
int len = (ids.size())/2
for (size_t i = 0; i < len; i++) {
if (ids[i] == id) {
//
string name = ids[i+1]
UNKNOWNNAME::decoding(data)
}
if (i == len && ids[i] != id) {
//error to add
std::cout<<"error: unknown sensor";
}
}
}
感谢您的帮助,我在C ++上还很陌生,如果需要,可以提供更清晰的解释。
钛
我认为您可能会从动态文件中选择功能,而选择动态type的功能(这更常见!)。
在面向对象程序设计中,最基本的思想之一是polymorphism
-能够以相同的方式使用多种类型,即使它们的行为不同;例如,您希望所有类型的传感器都具有decode
功能(decoding
不是一个好名字),每种功能的作用都不同,但是具有相同的signature。您只希望能够调用函数decode
,然后将调用正确实现。为了这样做,我们需要创建一个interface
(在C ++中是一个通用的基类),它将包含函数decode
,每个继承的类从中,需要实施。看起来像:#include <string> #include <vector> #include <memory> class ISensor { public: virtual void decode(const std::string& data) = 0; virtual std::string get_name() const = 0; virtual uint64_t get_id() const = 0; virtual ~ISensor() = default; }; class BaseSensor : public ISensor { public: virtual void decode(const std::string& data) = 0; std::string get_name() const override { return name; } uint64_t get_id() const override { return id; } protected: BaseSensor(const std::string& name_, uint64_t id_) : name(name_), id(id_) { } std::string name; uint64_t id; }; class SensorA final : public BaseSensor { public: SensorA(uint64_t id_) : BaseSensor("SensorA", id_) { } void decode(const std::string& data) final { // do something } }; class SensorB final : public BaseSensor { public: SensorB(uint64_t id_) : BaseSensor("SensorB", id_) { } ~SensorB() = default; void decode(const std::string& data) final { // do something different } };
这是部分解释,因为它是编程中非常复杂的想法,但它可能是您需要遵循的方向。
用法如下:
int main() { std::string data ="some data"; std::vector<std::unique_ptr<ISensor>> vec; vec.push_back(std::unique_ptr<ISensor>(new SensorA(0))); vec.push_back(std::unique_ptr<ISensor>(new SensorB(1))); for (const auto& sensor: vec) { sensor->decode(data); } }
备注-我个人不在接口和基类之间混合使用。接口是纯虚拟的,并且已构建基类,因此共享代码(例如
get_id
或get_name
将仅实现一次,而所有其他内容都可以在派生类中实现。