Вложенные классы в c

#c #class #nested

Вопрос:

 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);
     //...
}
 

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

Комментарии:

1. Не могли бы вы описать «не работает»? Я уверен, что здешние гуру могут заметить это напрямую, но нам, смертным, нужны ошибки компилятора или что-то в этом роде 😉 Я также предполагаю Class , что это просто опечатка.

2. Ну, код успешно компилируется. Но когда я сталкиваюсь с толкнутым элементом, я ничего не получаю. Но если я использую std::вектор, я могу получить значение, которое вытолкнуло.

3. Может быть, покажете нам некоторые из методов MyVec ? Как это operator[] определяется? Как это pushback определяется?

4. Вы имеете в виду, что вы возвращаете значение, но не можете его получить? Не может ли это указывать на ошибку в вашем методе push; ошибку, не связанную с приведенным выше примером?

5. Я думаю, что методы внутри MyVec работают правильно, так как я проверил это с помощью b.pushback(элемент);

Ответ №1:

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

 #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 amp; o )
        {
          if( obj )
          {
            *obj = o;
          }
          else
          {
            obj = new Obj(o);
          }
          std::cout<<this<<" : Pushing object "<<amp;o<<std::endl;
        }

        //some methods...
        //My operator[] just returns the stored object.
        Objamp; 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 и один толчок к внутреннему объекту от чего-то)

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

Ответ №2:

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