#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()…