gpt4 book ai didi

c++ - 使用基类而不是基指针来处理派生类

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:30 24 4
gpt4 key购买 nike

我有一个像这样的基础抽象类;

class X {
public:
virtual ~X(){}
virtual doSomething() = 0;
};

然后我用几个类(如 Y、Z 等)来实现它,每个类都有自己的构造函数、析构函数和 doSomething 实现。在我的主要职能中,我这样做;

int main(){
std::vector<X *> v;
X *x1 = new Y();
X *x2 = new Z();
v.push_back(x1);
v.push_back(x2);
for(auto p : v){
p->doSomething()
}
}

这会按预期调用相应的 doSomething 实现。但我的问题是我使用指向抽象类的指针通过其基类来操纵派生类的层次结构。这迫使我使用 new 在堆上创建实例,之后我必须手动删除它们。有没有办法做这样的事情;

int main(){
std::vector<X> v;
Y x1();
Z x2();
v.push_back(x1);
v.push_back(x2);
for(auto p : v){
p.doSomething()
}
}

这样当我退出 main 时,析构函数将被自动调用。我知道我不能创建抽象类的成员,但使用指针来实现这一切似乎很奇怪。当然,必须有一种方法可以在没有指针和新删除的情况下执行此操作。如果有人向我展示最佳实践,那就太好了。

最佳答案

您想使用合适的智能指针:

std::vector<std::unique_ptr<X>> v;

v.push_back(std::make_unique<Y>());
v.push_back(std::make_unique<Z>());

// all done

(当然还有动态分配,因为如果没有运行时间接寻址,你无法管理无限数量的不受约束的类型,但你永远不必思考手动进行任何动态管理。类型系统可以为您完成所有工作。)

关于c++ - 使用基类而不是基指针来处理派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36966313/

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