成员指向成员对象和声明顺序的指针

时间:2013-03-13 12:01:12

标签: c++ pointers inheritance member

#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;

}

以上示例的工作方式与我想要的一样.i.e。将指针p_bar链接到bar。但是,我担心的是我指的是一个尚未调用其构造函数的成员。

此代码是否有效,或标准是否有关于它的说法。如果没有替代方案。

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

2 个答案:

答案 0 :(得分:2)

如果要将指针传递给成员,则在尝试取消引用之前,没有任何未定义的行为。如果你想让构造函数调用base-from-member idiom http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Base-from-Member

答案 1 :(得分: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;
}

LWS

我的意思是,如果FooParent的构造函数仅将指针存储到外部int(或Bar - 无所谓),那么将会有没问题。

另一方面,如果您将bar副本发送给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;
}

LWS

这不起作用。即使Bar具有复制c-tor或/和赋值运算符