Вложенные классы в c ++ - PullRequest
1 голос
/ 09 мая 2011
class A{
public:
      template<typename Obj>
      class MyVec{
           //some methods...
      };
      MyVec<A> a; //-> doesnt work
      //vector<A> a; //using stl vector-> this works
};

class B{
public:
      void someMethod();
private:
      A::MyVec<A> b;
};

В методе, когда я делаю что-то вроде:

void someMethod(){
     //...
     b[0].a.pushback(element);
     //...
}

В классе A, если я использую std :: vector, все работает правильно.Но когда я использую вложенный класс, он не работает.

Ответы [ 2 ]

2 голосов
/ 09 мая 2011

Я взял ваш код и изменил его как можно меньше, чтобы получить что-то, что компилируется.Кажется, это работает нормально.И поэтому ошибка не в коде, который вы нам показали.

#include <iostream>
#include <string>

class A
{
  public:
    template<typename Obj>
      class MyVec{
        public:
        //My pushback just stores the value away for later.
        void pushback(Obj & o )
        {
          if( obj )
          {
            *obj = o;
          }
          else
          {
            obj = new Obj(o);
          }
          std::cout<<this<<" : Pushing object "<<&o<<std::endl;
        }

        //some methods...
        //My operator[] just returns the stored object.
        Obj& operator[](int i) { return *obj; }
        Obj * obj;
        MyVec() : obj( NULL ) {}
      };
    MyVec<A> a;
};


class B
{
public:
B()
{
   A an_a;
   b.pushback(an_a); //Better store one away since we access it in someMethod.
}
void someMethod()
{
     //...
     A element;
     b[0].a.pushback(element);
     //...
}
private:
      A::MyVec<A> b;
};

int main()
{
   //Test that it all works
   B outer;
   outer.someMethod();
}

Когда я запускаю это, я получаю:

0xbffffa5c : Pushing object 0xbffffa0c
0x3ec3c0 : Pushing object 0xbffffa2c

Что я и ожидал(один толчок в конструкторе B и один толчок во внутренний объект от someThing)

Вы можете просмотреть результат здесь: http://ideone.com/BX8ZQ

2 голосов
/ 09 мая 2011

Вы действительно должны показать код внутри MyVec.На первый взгляд, возможно, оператор MyVec [] не возвращает ссылку, поэтому, когда вы делаете b [0] .pushback, вы меняете копию вместо того, что вы хотите;вы не получите эту проблему, если вы только что протестировали с b.pushback () ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...