1
#include <iostream>

class FooParent
{
    public:
        FooParent(int* new_p_bar)
        {
            p_bar = new_p_bar;
        }
    public:
        int* p_bar;
};

class FooChild : public FooParent
{
    public:
        int bar;
    public:
        FooChild(int new_x)
        :FooParent(&bar)
        ,bar(new_x) \\ point of concern
            {} 
};

int main()
{ 
    FooChild foo(8);
    std::cout << foo.bar << std::endl;

}

上面的示例按我的意愿工作。即将指针链接p_barbar. 但是,我担心的是我指向一个尚未调用其构造函数的成员。

这段代码是否有效,或者标准对此有什么要说的。如果不是还有什么选择。

注意:在我的应用程序bar中是一个对象Bar(不是int),这有什么影响吗?

4

2 回答 2

2

如果您将指针传递给成员,则没有未定义的行为,直到您尝试取消引用它。如果您想调用构造函数,请查看base-from-member习语http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Base-from-Member

于 2013-03-13T12:21:08.217 回答
0

看这个:

class FooParent {
    public:
        FooParent(int* new_p_bar)
        {
            p_bar = new_p_bar;
            *p_bar = 99; // this has no sense
        }
        void set99() {
            *p_bar = 99; // this - has
        }
    public:
        int* p_bar;
};

class FooChild : public FooParent
{
    public:
        int bar;
    public:
        FooChild(int new_x)
        :FooParent(&bar)
        ,bar(new_x) // point of concern
            {} 
};

int main()
{ 
    FooChild foo( 42 );
    std::cout << foo.bar << std::endl;
    foo.set99();
    std::cout << foo.bar << std::endl;
}

轻量级_

我的意思是,如果FooParent的构造函数只存储一个指向外部的指针int(或Bar- 没关系),那么就不会有问题。

另一方面,如果您要提供一份tobar -FooParent像这样

class FooParent
{
    public:
        FooParent(Bar new_p_bar)
        {
            p_bar = new_p_bar;
        }
        void set99() {
            p_bar = 99; // this - has
        }
    public:
        Bar p_bar;
};

class FooChild : public FooParent
{
    public:
        Bar bar;
    public:
        FooChild(Bar new_x)
        :FooParent(bar)
        ,bar(new_x) // point of concern
            {} 
};

int main()
{ 
    FooChild foo( 42 );
    std::cout << foo.bar << std::endl;
    foo.set99();
    std::cout << foo.bar << std::endl;
}

轻量级_

这行不通。即使Bar会有一个复制 c-tor 或/和赋值运算符

于 2013-03-13T13:40:40.727 回答