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_barを にリンクしますbar。ただし、私の懸念は、コンストラクターがまだ呼び出されていないメンバーを指していることです。

このコードは有効ですか、それとも標準はそれについて何か言いたいことがありますか? そうでない場合、代替手段は何ですか。

: 私のアプリケーション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;
}

LWS .

FooParentのコンストラクターが外部へのポインターのみを格納する場合int(またはBar- は関係ありません)、問題はありません。

一方、 toのコピーを渡す場合- このようにbarFooParent

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または/および代入演算子がある場合でも

于 2013-03-13T13:40:40.727 に答える