Унаследованный член класса шаблона прекрасно тестирует в конструкторе цепочки, но после этого «теряется» - PullRequest
0 голосов
/ 28 марта 2012

Мой базовый класс, class Foo, является шаблоном класса, который имеет следующий конструктор:

//Declarations
template <class T>
class Foo
{
public:
    Foo::Foo(std::string& root);
    MemberClass obj;
}

template <class T>
Foo<T>::Foo(std::string& root)
{
    MemberClass obj(root); // initialize the member object
    obj.getRoot(); // Prints the string
    // ...
}

У него есть дочерний класс, который построен следующим образом:

template <class T>
Bar<T>::Bar(std::string& root)
    : Foo<T>(root)
{
    //...
}

template<class T>
void
Bar<T>::accessObj()
{
    this->obj.getRoot();
    // Prints the empty string
}

Это дает неожиданное поведение, даже если ошибки не генерируются. В этом случае getRoot() вернет пустую строку.

Я проверил это, изменив конструктор Foo следующим образом:

{
    MemberClass obj(root);
    std::cout << &obj << std::endl;
}

и конструктор Bar примерно так:

//...
    : Foo<T>(root)
{
    std::cout << &this->obj << std::endl;
}

Вывод дает два разных места в памяти, что полностью поражает меня. Почему это так? Как мне это исправить?

1 Ответ

0 голосов
/ 28 марта 2012

Ваш конструктор может выглядеть лучше так:

template <class T>
Foo<T>::Foo(std::string& root)
    : obj(root) // initialize the member object
{
    obj.getRoot(); // Prints the string
    // ...
}

Раньше вы конструировали временный obj в конструкторе Foo и отбрасывали его, никогда не инициализируя переменную-член вообще.

Если вы используете GCC, опция -Wshadow могла бы помочь отловить эту ошибку.

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