-1
#include <iostream>
#include <string>

using namespace std;

class A
{
public:
    A() { i=1; j=2;};
    A (A &obj) { i= obj.i+100; j= obj.j+100;};
     int i;
     int j;
};

class B:public A
{
public:
    B():A() {i=10; j=20; k=30;};

    B(A &obj) {  A::A(obj); k=10000; };//

    int k;
};

int main()
{ 
    A dog;
    B mouse(dog);
    cout<<mouse.i<<endl;
    cout<<mouse.k<<endl;

    return 0;
}

基本クラスのコピー コンストラクターを利用する派生クラスのコピー コンストラクターを作成しようとしています。これはmouse.i101 になるはずですが、実際にはコンパイル結果は 1 ですmouse.k。私のコードの何が問題なのか疑問に思っていました。

4

4 に答える 4

5

親のコンストラクターを呼び出すには、初期化リストを使用する必要があります (他のすべてのメンバーに対しても行う必要があります)。

B(A const& obj) : A(obj), k(10000) {}

さらに、コピーするときは元のオブジェクトを変更しないため、元のオブジェクトへのconst参照を取得する必要があります。これにより、定数オブジェクトから (または定数参照を介して) コピーできるようになり、定数の正確性が向上します。

于 2012-07-03T15:10:53.600 に答える
5

このコンストラクターでは:

B(A &obj) {  A::A(obj); k=10000; };

A::A(obj);基本サブオブジェクトを初期化しません。代わりに、 とも呼ばれるローカル オブジェクトを作成しますobj。と同等でA::A obj;、 と同等A obj;です。[更新: または、何か他のことを行っているか、形式が正しくない可能性があります - いずれにせよ、それは間違っています。]

初期化子リストを使用したい:

B(A & obj) : A(obj), k(10000) {}

また、ほぼ確実にA const &、定数オブジェクトまたは一時オブジェクトからの構築を可能にするために、コンストラクターのパラメーターを にする必要があります。

于 2012-07-03T15:11:12.700 に答える
4

次のように基本クラスを初期化する必要があります。

B(A &obj):A(obj) {  k=10000; }

(これについては、スーパークラス コンストラクターを呼び出すためのルールは何ですか?で詳しく説明します)。補足:constコピー コンストラクターの引数に使用します。

A (const A &obj) {...}

編集

インスタンス メンバーを初期化するための推奨される方法は、初期化リストを使用することです。そのため、ctor は次のようになります。

B(A &obj):A(obj), k(10000) { }
于 2012-07-03T15:10:15.740 に答える
0
#include <iostream>
#include <string>

using namespace std;

class A
{
public:
A()
{
    i=1;
    j=2;
}

A (A &obj)
{
    i= obj.i+100;
    j= obj.j+100;
}

 int i;
 int j;
};

class B:public A
{
public:
B():A() {i=10; j=20; k=30;}

B(A &obj)
:A(obj)
 {
  //A::A(obj);
  k=10000;
  }//

int k;
};

int main()
{
    A dog;
    B mouse(dog);
    cout<<mouse.i<<endl;
    cout<<mouse.k<<endl;

    return 0;
}

これは私のために働きます

B(A &obj)
{
    A::A(obj)
}

gcc コンパイラでは違法です

于 2012-07-03T15:22:50.860 に答える