gpt4 book ai didi

c++ - 列表容器 - 使用不相关的类型存储和移除

转载 作者:太空宇宙 更新时间:2023-11-04 14:11:40 25 4
gpt4 key购买 nike

编辑:

我选择重写我的整个问题,并逐步使它变得更多。

所以我想将类型存储在 std::list 中(如下所示的 ObjectA 和 ObjectB),而这些类型又必须具有返回预期类型的​​成员属性(如本例中的 int const*):

class ObjectA
{

public:

int const* GetItem () {return mpItem;} const;

private:

int* mpItem;
ObjectC mrObjectC;

}; // class



class ObjectB
{

public:

int const* GetItem () {return &mrItem;} const;

private:

int mrItem;
ObjectD mrObjectD;

}; // class

所以现在上面的两个对象需要在 std::list 中,如下所示:

ObjectA         nrA;
ObjectB nrB;

std::list<### const*> nrRender;

nrRender.push_back (nrA); // comes down to storing ObjectA and ObjectB
nrRender.push_back (nrB); // inside the same list

完成后。子例程迭代 std::list 并发送数据以进行进一步处理,如下所示:

std::list<###   const*> nrRender::const_iterator niObject;
for (niObject = nrRender.begin(); niObject != nrRender.end(); ++niObject) {

this -> Display ((*niObject).GetItem ());

}

最后我也想这样做:

nrRender.remove(nrA);
nrRender.remove(nrB);

最佳答案

如果我正确理解你的代码,nrZ对象可以检查通过 HooksInto 传递给它的任何内容方法,并保留在该参数中找到的内部对象的引用。

例如,如果对象 nrB包含对象 iB1iB2 , nrZ可以通过检查 nrB 找到它们并保留对它们的引用.

nrRender.push_back(nrZ)调用nRender获取这些引用并存储它们以供进一步处理;然而,如果nrRender.remove(nrB)被调用时,必须从 nrRender 中删除这些引用对象。

我假设 list您的代码中提到的模板实际上是 std::list .

所以,nrRender只能存储 TypeZ 类型的值.这实际上是您代码中的问题。如果你想要nrRender跟踪TypeATypeZ值,那么你必须使它成为最通用类型的列表:TypeA .然而,一旦一个值被插入列表,它的完整类型就会被遗忘,如下图所示:

  list<TypeA *> nrRender;
TypeB nrB;
TypeA *ptr;

nrRender.push_back(&nrB);
ptr = nrRender.pop_back(); // here we're getting back nrB,
// but now it's a (TypeA *) value

此外,如果您的列表不是指向实例的指针列表,那么您将无法保存对传入对象的引用。

接下来,您想要的功能不可用。 nrZ::HooksInto方法建议您的对象是使用组合构建的,当您需要通过继承为 list<TypeA>::remove 构造它们时按要求工作的方法。

如果list不是 std::list ,但是您希望实现具有所需功能的某些模板,我想这可以做到,但我不认为将其设为模板有什么意义。

 class render_list {

public:
/* ... */
void push_back(const TypeZ &t){
// get the inner references within t
// store them in this instance
}
void remove(const TypeA &t){
// remove t
}
// overload remove if necessary to handle TypeB peculiarity
void remove(const TypeB &t){
// remove t
}
// etc.
void remove(const TypeA &t){
// remove t
}
};

请注意,如果没有关于您真正想要实现的目标的更多详细信息,就很难提供更好的指导。

关于c++ - 列表容器 - 使用不相关的类型存储和移除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13897900/

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