gpt4 book ai didi

c++ - 比从基类转换到派生类更好的方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:04:35 26 4
gpt4 key购买 nike

我知道这样的沮丧是行不通的。我需要一种可行的方法。这是我的问题:我有几个不同的派生类都来自一个基类。我的第一次尝试是创建一个基类数组。该程序必须(或多或少随机地)选择不同的派生类。我曾尝试从基类转换为派生类,将其放入基类的数组中,但显然这没有用。我真诚地希望有另一种方法,而不是简单地粘贴所有派生类的数组,因为可能有很多派生类。有没有更好的方法来做到这一点,我只是在开脑洞?

如果你们都需要代码示例或更多信息,请告诉我。这一切对我来说都是有意义的,但是已经晚了,对其他人来说可能没有意义嘿。

非常感谢任何帮助,伙计们。

最佳答案

不太清楚你的意思。听起来像您按值存储对象,并且您有一个 Base 数组。这是行不通的,因为一旦您分配了一个 Derived,该对象就会被转换为一个 Base,并且该对象的 Derived 部分会被切掉。但我认为你想要一组指向基的指针:

Base * bases[NUM_ITEMS];
for(int i=0; i<NUM_ITEMS; i++) {
int r = get_random_integer();
if(r == 0)
bases[i] = new Derived1;
else if(r == 1)
bases[i] = new Derived2;
// ...
}

如果你曾经使用过指针,你就会知道管理它们是一件很痛苦的事情,尤其是在空间上传递而不丢失它们,因为你需要对它们调用 delete 来释放内存并调用它们的析构函数对象。您可以使用 shared_ptr,它会为您管理:

shared_ptr<Base> bases[NUM_ITEMS];
for(int i=0; i<NUM_ITEMS; i++) {
int r = get_random_integer();
if(r == 0)
bases[i].reset(new Derived1);
else if(r == 1)
bases[i].reset(new Derived2);
// ...
}

现在,您可以将 bases[x] 传递给另一个 shared_ptr,它会注意到您有多个引用 - 如果对象的最后一个引用超出了,它会自动调用 delete范围。理想情况下,您还可以将原始数组替换为 std::vector:

std::vector< shared_ptr<Base> > bases;
for(int i=0; i<NUM_ITEMS; i++) {
int r = get_random_integer();
if(r == 0)
bases.push_back(shared_ptr<Base>(new Derived1));
else if(r == 1)
bases.push_back(shared_ptr<Base>(new Derived2));
// ...
}

然后你可以传递这个 vector ,并且不会丢失它的大小,你可以根据需要动态地向它添加项目。使用 bases.size() 获取 vector 的大小。阅读有关 shared_ptr here 的信息.

从基类到派生类的转换应该只在绝对必要的时候进行。通常,您想使用一种称为多态性的技术,这意味着您在基指针上调用一个函数,但它实际上会调用派生类中定义的函数,具有相同的签名(名称和参数)是同一类型)并且据说要覆盖它。阅读 article在维基百科上关于它。如果你真的需要转换,你可以像这样对原始指针进行转换:

Derived1 * d = &dynamic_cast<Derived1&>(*bases[x]);

使用 dynamic_cast 确保,当您转换为错误的类型时(即您转换的类型不是创建并分配给基指针的类型),您会得到运算符(operator)抛出的异常。对于 shared_ptr 的情况,也有一些方法:

shared_ptr<Derived1> d = dynamic_pointer_cast<Derived1>(bases[x]);
if(d) {
// conversion successful, it pointed to a derived. d and bases[x] point still
// to the same object, thus share it.
}

关于c++ - 比从基类转换到派生类更好的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/412344/

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