继承的模板类成员在链构造函数中测试很好,但之后会“丢失”

时间:2012-03-27 23:28:21

标签: c++ templates inheritance

我的基类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 :(得分: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可能有助于发现这个错误。