动态分配结构

时间:2019-06-20 21:22:30

标签: c++ struct

我有五个不同的结构可以根据“类型”变量创建。我有很多代码行依赖于此“临时”对象存在(大约有50行代码将变量加载到结构中)。

当前,下面列出的代码不起作用,因为temp被限制在if语句的本地范围内,因此它不在它的外部。

我不能简单地在顶部实例化一个通用端口,因为每个端口都有不同的特性。

很明显,我可以将所有成员分配代码都包含在if语句中,但这是令人难以置信的混乱和笨拙。

是否有一种方法可以为每种端口类型分配适当的变量,而无需大量重组我的代码?

class Abc
    {
        cv::VideoCapture cap;
        Abc(){
        cap.open(0);
        }
        void frameDetails(int width = 640,int height =480){
        cap.set(CV_CAP_PROP_FRAME_WIDTH,width);
        cap.set(CV_CAP_PROP_FRAME_HEIGHT,height);
    }
};

int main(int argc, char **argv){
    Abc obj();
    return 0;
}

2 个答案:

答案 0 :(得分:2)

通常要做的是拥有一个共享的基类:

struct portCommon {
    std::string foo;
    std::string bar;
    std::string bash.
};
struct portFc : public portCommon {
};
...etc

和工厂地图。

const std::map<std::string, std::function<std::unique_ptr<portCommon>>> factories = {
    {"FC", [](){return std::make_unique<portFc>();}},
    {"SAS", [](){return std::make_unique<portSas>();}},
    {"PCIe", [](){return std::make_unique<portPcie>();}},
    {"iSCSI", [](){return std::make_unique<portIscsi>();}},
    {"IPREP", [](){return std::make_unique<portIprep>();}}
};

使用辅助方法:

std::unique_ptr<portCommon> createPort(const std::string& type) {
    auto iter = factories.find(type);
    if (iter != factories.end()) {
        return iter->second();
    } else {
        return std::make_unique<portGeneric>();
    }
}

然后代码更简单:

std::string id;
std::string type;

inputStream >> id;
inputStream >> type;

std::unique_ptr<portCommon> temp = createPort(type);
inputStream >> temp->foo;
inputStream >> temp->bar;
inputStream >> temp->bash;
.
.
.
inputStream >> temp->final;

答案 1 :(得分:1)

有一种相对简单的方法可以使用C ++ 14中引入的通用lambda。该函数的工作方式几乎与您的工作方式相同,除了我们需要定义包含{<1>}一系列语句之前的其余函数的lambda(因为它需要当您调用它时会出现在作用域中)。

if