1

编辑:

我选择重写我的整个问题,并一步一步地让它变得更详细。

因此,我想将类型存储在 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);
4

2 回答 2

0

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

例如,如果对象nrB包含对象iB1,并且iB2nrZ可以通过检查来找到它们并保持对它们的引用nrB

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

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

因此,nrRender只能存储 type 的值TypeZ。这实际上是您的代码中的一个问题。如果要nrRender跟踪值,则必须将其设为最通用类型的列表TypeA:。然而,一旦一个值被压入列表,它的完整类型就会被遗忘,如下图所示:TypeZTypeA

  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
     }
 };

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

于 2012-12-16T05:10:32.667 回答
0

在与编译器斗争了半天之后,这是解决方案(虚拟接口和基类合二为一):

class TypeA
{

public:

    virtual int GetCount () = 0; // The notation =0 simply indicates the Virtual function is a pure virtual function as it has no body

};



class TypeB : public TypeA
{

    string      GetTitle ();

public:

    string      mrTitle;

};



class TypeC : public TypeB
{

public:

    int GetCount () {return 5;}

};



class TypeD : public TypeB
{

public:

    int GetCount () {return 8;}

};

测试解决方案:

        TypeC           nrC;
        TypeD           nrD;
        list<TypeB*>    nrRender;

        nrRender.push_back(&nrC);
        nrC.GetCount();

        nrRender.push_back(&nrD);
        nrC.GetCount();

        cout << endl << "Ca: " << &nrC;
        cout << endl << "Da: " << &nrD;

        cout << endl << "SizeA: " << nrRender.size();

        list<TypeB*>::iterator niItem;
        for (niItem = nrRender.begin(); niItem != nrRender.end(); ++niItem) {

            cout << endl << "Adress: " << (*niItem);
            cout << endl << "Counts: " << (*niItem) -> GetCount();

        }

        nrRender.remove(&nrD);

        cout << endl << "SizeB: " << nrRender.size();

        for (niItem = nrRender.begin(); niItem != nrRender.end(); ++niItem) {

            cout << endl << "Adress: " << (*niItem);
            cout << endl << "Counts: " << (*niItem) -> GetCount();

        }

我希望这会对某人有所帮助。

于 2012-12-16T09:01:33.033 回答