0

クラス A から継承された C++ クラス B があります。おそらく OOP の重要な概念を見逃しており、これは確かに非常に些細なことですが、B のインスタンス化後、B 内で A のコンストラクターを使用して再割り当てする方法がわかりません。A から継承されたローカル変数のみに新しい値:

クラスA

class A{
    public:
        A(int a, int b){
            m_foo = a;
            m_bar = b;
            }
    protected:
        int m_foo;
        int m_bar;
};

クラスB

class B : public A{
    public:
        B(int a, int b, int c):A(a,b),m_loc(c){};
        void resetParent(){
            /* Can I use the constructor of A to change m_foo and 
             * m_bar without explicitly reassigning value? */

            A(10,30); // Obviously, this does not work :)

            std::cout<<m_foo<<"; "<<m_bar<<std::endl; 
            }
    private:
        int m_loc;
};

主要

int main(){
    B b(0,1,3);
    b.resetParent();
    return 1;
    }

この特定の例では、b.resetParent()which を呼び出してと(in )A::A()の値をそれぞれ 10 と 30 に変更します。したがって、「0; 1」ではなく「10; 30」と出力する必要があります。m_foom_barb

ご助力ありがとうございます、

4

2 に答える 2

3

コンストラクターを使用してオブジェクトを変更することはできません。構築するためだけに使用できます。public既に構築されたオブジェクトを変更するには、そのオブジェクトとprotected(派生の場合class) メンバーを使用する必要があります。あなたの例では、後で状態をリセットするために使用できるメンバー関数Aを実装する必要があります。reset()

于 2013-04-20T22:15:30.040 に答える
2

いいえ、基本クラスのコンストラクターを呼び出して値をリセットすることはできません。ただし、リセットする値は次のように宣言されているため、値protectedB直接アクセスできます。

void resetParent()
{
    m_foo = 10;
    m_bar = 30;

    std::cout << m_foo << "; " << m_bar << std::endl; 
}

代入演算子が定義されている場合 Aは、=代わりに一時Aインスタンスを宣言して、それを基本クラスに割り当てることができます。

void resetParent()
{
    *this = A(10, 30);
    // or:
    // A::operator=(A(10, 30));

    std::cout << m_foo << "; " << m_bar << std::endl; 
}
于 2013-04-21T06:27:43.353 に答える