((c ++)导入仅通过字符串知道其名称的.hpp

问题描述 投票:-1回答:1

问了一个问题(对不起,我的英语可能是随机的)

我需要导入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 ++上还很陌生,如果需要,可以提供更清晰的解释。

c++ list function import id
1个回答
0
投票

我认为您可能会从动态文件中选择功能,而选择动态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_idget_name将仅实现一次,而所有其他内容都可以在派生类中实现。

© www.soinside.com 2019 - 2024. All rights reserved.