gpt4 book ai didi

充满抽象对象的 C++ 容器

转载 作者:搜寻专家 更新时间:2023-10-31 00:11:46 25 4
gpt4 key购买 nike

我的背景主要是 C 和 Java(还有一些其他知识),并且已经开始使用 C++ 开发一个项目。我的确切任务是从配置文件生成一组对象(即读取文件,确定要创建的对象类型,将其添加到列表,重复)。有问题的部分相当于以下内容:

(我使用 C char* 语法,因为我可以很容易地为这里的示例编写它——假设我实际上也不知道我需要多少,这就是为什么我会喜欢使用vector)

class General {
public:
virtual int f()=0;
};
class SpecificA : public General {
public:
virtual int f();
};
class SpecificB : public General {
public:
virtual int f();
};
std::vector<General> build(char** things, int number) {
std::vector<General> result;
for(int i=0;i<number;i++) {
if(strcmp(things[i],"A")) {
result.push_back(SpecificA());
} else if(strcmp(things[i],"B")) {
result.push_back(SpecificB());
}
}
return result;
}

这行不通,因为我无法拥有 Generalvector,因为您实际上永远无法拥有 General 的实例>。从我读过的不同地方,

  • 我应该使用指针,这样多态性才能正常工作
  • C++ 指针实际上应该永远不需要,因为它们不是必需的,自动指针几乎总是在您确实需要它们时更好,而且通常您可以使用引用来代替
  • 大的struct(例如类)应该通过引用传递而不是复制并从函数返回
  • 在 C++ 中返回完整对象完全没问题

开始感觉有点像C++要我借助C的工具来使用Java的内存实践,确实行不通。在这一点上,我很想放弃任何涉及自动内存分配的最佳实践,并在我的代码中乱扔 *,但我想听听是否有“正确的”方法首先做到这一点。

最佳答案

如评论中所述,您可以通过以下方式使用 unique_ptr:

std::vector<std::unique_ptr<General>> build(char** things, int number) {
std::vector<std::unique_ptr<General>> result;
for(int i=0;i<number;i++) {
if(strcmp(things[i],"A")) {
result.push_back(std::unique_ptr<General>(new SpecificA()));
} else if(strcmp(things[i],"B")) {
result.push_back(std::unique_ptr<General>(new SpecificB()));
}
}
return result;
}

关于充满抽象对象的 C++ 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32769869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com