我的基类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;
}
输出在内存中提供了两个不同的位置,这完全是我的想法。为什么会这样?我该如何解决?
答案 0 :(得分:0)
你的构造函数可能看起来更像这样:
template <class T>
Foo<T>::Foo(std::string& root)
: obj(root) // initialize the member object
{
obj.getRoot(); // Prints the string
// ...
}
之前,你在你的Foo构造函数中构建一个临时的obj
并抛弃它,从来没有初始化你的成员变量。
如果你正在使用GCC,选项-Wshadow可能有助于发现这个错误。