gpt4 book ai didi

c++ - 将从接口(interface)派生的类的实例添加到接口(interface)指针数组

转载 作者:行者123 更新时间:2023-11-28 02:38:55 25 4
gpt4 key购买 nike

我有一个名为 IFoo 的接口(interface)结构。

struct IFoo
{
void someFunc();

virtual ~IFoo()
{
}
};

我有多个从接口(interface)派生的结构。每个结构可以有不同的构造函数。

struct FooA : IFoo
{
FooA(int i1, int i2)
{
}

void someFunc()
{
}

~FooA()
{
}
};

struct FooB : IFoo
{
FooB(int i)
{
}

void someFunc()
{
}

~FooB()
{
}
};

我有一个结构,它(将)包含一个指针数组(在示例中,为了简单起见,只有一个项目)。

struct FooContainer
{
IFoo* fooItem;
};

FooContainer 对派生实例一无所知。

我已经编写了以下代码,它似乎可以工作。

以这种方式将 IFoo 的指针设置为派生结构(例如 FooA)的指针是否有效?

谁能告诉我这是否是个好主意?它似乎工作正常......但我现在更愿意知道我可能遇到的任何问题(内存问题等),而不是在更远的地方找到它们。我知道我需要添加缺少的方法...赋值运算符、复制构造函数等 :)

struct FooContainer
{
IFoo* fooItem; // this will be an array of ifoo pointers in actual code

FooContainer()
: fooItem(0)
{
}

template <typename T>
void setFoo(const T& foo)
{
delete fooItem;

fooItem = new T(foo); // this will add the item to the array
}

~FooContainer()
{
delete fooItem;
}
};

这样调用:

FooContainer fooContainer = FooContainer();
fooContainer.setFoo(FooA(1, 1));

这不是 C++11,以防万一。

最佳答案

Is it valid to set a pointer of IFoo to a pointer of a derived struct (say, FooA)?

是的,这是完全正确的做法。

当您有一个指向派生类型的指针,并将其分配给指向其基类型之一的指针时,编译器会根据需要自动调整指针。您对 fooContainer.setFoo(FooA(1, 1)) 的调用使编译器实例化

void setFoo<FooA>(const FooA& foo)

因此新的和赋值变成了

fooItem = new FooA(foo);

这里,new FooA(foo) 返回一个FooA*,它根据赋值运算符的要求被隐式转换为一个IFoo* .

唯一需要注意的事情(您已经做对了)是在基类中声明(并可能定义)一个虚拟析构函数。这是必需的,因此如果您删除 fooItem,将调用实际对象的析构函数(例如 FooA::~FooA())。

对于派生类,您不需要定义空的析构函数。

关于c++ - 将从接口(interface)派生的类的实例添加到接口(interface)指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26653632/

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