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

Member pointer to member object and declaration order

本文关键字:声明 顺序 指针 成员 成员对象      更新时间:2023-10-16
#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_bar链接到bar。但是,我担心的是,我所指向的成员的构造函数尚未被调用。

这个代码是否有效,或者标准对它有什么规定。如果没有,有什么替代方案。

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

如果你正在传递指针给成员,没有未定义的行为,直到你试图解引用它。如果您希望调用构造函数,请查看base-from-member习惯用法http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Base-from-Member

看这个:

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 -无关紧要)的指针,那么就没有问题了。

另一方面,如果您将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;
}

镜。

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