0

私はこのコードスニペットを持っています

class Osoba{
         Osoba(char* imie,int wiek){                         
                     this->imie=new char[strlen(imie)+1];
                     strcpy(this->imie,imie);
                     this->wiek=wiek;
                     cout<<"Utworzono Osobe "<<this->imie<<endl;
         }
         Osoba(Osoba& x){
                 Osoba(x.imie,x.wiek);
         }
[...]

そして、コピーコンストラクターを呼び出すと、機能しません(オブジェクトを作成および破棄します)。

編集:私が使用する場合

         Osoba(Osoba& x): Osoba(x.imie,x.wiek){

私は得るtype 'class Osoba' is not a direct base of 'Osoba'

これはどのように行われますか?

4

4 に答える 4

10

そのようなコンストラクターを呼び出すことはできません。できますが、名前のない一時オブジェクトが作成されます。コピー コンストラクターは、他のコンストラクターを参照せずに記述します。また、char * の代わりに std::string を使用すると、コピー コンストラクターは必要ありません。char * を使い続ける場合は、デストラクタと代入演算子も必要になります。

于 2011-05-17T12:30:19.600 に答える
3

Osoba他のコンストラクターで行っているのと同じ方法で、のメンバーを初期化する必要があります。

C++2011 では、コンストラクターを (他の構文で) のみ再利用できます。

于 2011-05-17T12:32:10.953 に答える
1

別の異なるオブジェクトを作成する場合を除いて、コンストラクターを呼び出すことはできません。

コンストラクター間で共通のコードが必要な場合は、別のメソッドに配置してそのメソッドを呼び出すことができます。コンストラクターでは、オブジェクトのメソッドを呼び出すことができますが、virtualメソッドは派生クラスをディスパッチしないことに注意してください。

言い換えれば、あなたが持っている場合

struct Foo
{
    virtual void doit() { ... }
    Foo() {
        doit();
    }
};

struct Bar : Foo
{
    virtual void doit() { ... }
};

派生オブジェクトの基本部分のコンストラクターの間、オブジェクトは「ベース」オブジェクトにすぎないため、呼び出されBarたの実装のコンストラクターの間は でdoit定義されたものになります。コンストラクターの最後でFooのみ、「派生」コンストラクターで最終的に存在するコードを実行する直前に「派生」オブジェクトになります。

他のオブジェクト指向言語は異なるアプローチを使用することに注意してください...

C++ で正確に何が起こるかの説明については、この記事を参照してください

代わりに法律上の説明が必要な場合は、これが C++ 標準の 12.7.4 に記載されています。

仮想関数 (10.3) を含むメンバー関数は、構築または破棄 (12.6.2) 中に呼び出すことができます。仮想関数がコンストラクター (データ メンバーの mem-initializer からを含む) またはデストラクターから直接または間接的に呼び出され、呼び出しが適用されるオブジェクトが構築中または破棄中のオブジェクトである場合、呼び出される関数は、コンストラクタまたはデストラクタ自身のクラスまたはそのベースの 1 つで定義されたもの。ただし、コンストラクタまたはデストラクタのクラスから派生したクラスでそれをオーバーライドする関数、または最も派生したオブジェクトの他の基本クラスの 1 つでそれをオーバーライドする関数 (1.8 )。仮想関数呼び出しが明示的なクラス メンバー アクセスを使用する場合 (5.2.

于 2011-05-17T12:39:46.037 に答える
0

まず第一に、コンストラクターは単なるメソッドではありません。at をミューテーター メソッドとして使用することはできません。

つまり、あなたのクラスには imie と wiek という 2 つのフィールドがあると考えてよろしいですか?

x.imie と x.wiek を入力として、init コードをもう一度実行します。

于 2011-05-17T12:33:06.130 に答える