0

これは私が理解しようとしているコードです。特に用途はありません。私は何が起こるかを理解しようとしているだけです。

#include<iostream>
using namespace std;

class derivedClass;
class baseClass
{
public:
    int objID;
    derivedClass* dcObjPtr;

    baseClass()
    {
        cout << "(1) Default constructor" << objID << endl;
    }

    baseClass(int ID)
    {
        objID = ID;
        dcObjPtr = new derivedClass(1);
        cout << "(2) Constructing base object with ID: " << objID << endl;
    }
};

class derivedClass : public baseClass
{
public:
    derivedClass()
    {}

    derivedClass(int ID) : baseClass(ID)
    {
        cout << "(4) Constructing derived object with ID: " << objID << endl;
    }
};


int main(int argc, char** argv)
{
    derivedClass dcObj(1);

    return 0;
}

VS2013 を使用すると、「派生クラス: クラスにコンストラクターがありません」というエラーが表示されますが、これは正しいエラーではないと思います。

私は最初、ポインターではなく、derivedClass インスタンスを使用していました。そして、それはセミコロンに関する奇妙なエラーを私に与えていました. 次に、受け入れられた答えがインスタンスではなくポインターを持つことであるこの投稿を見ました。

これらは私が持っている質問です:

  1. コンストラクターがないことについてコンパイラーが不平を言うのはなぜですか。クラスには明らかにコンストラクターがあります。
  2. これはどのように機能しますか?dervedClass のインスタンスを作成すると、その中に baseClass 部分があります。そして、この baseClass 部分には、派生クラスが含まれています。これは再帰的です。それが機能する場合、セグメンテーション違反などの結果になると思います。これが再帰的であると仮定するのは正しいですか(機能する場合)?

乾杯。

4

1 に答える 1

1

コンストラクターderivedClassを呼び出すことにより、定義される前に のnew derivedClass定義を利用しています。baseClassあなたがする必要があるのは、次のように、コンストラクター定義を の外側baseClassと後に移動することです。derivedClass

#include<iostream>
using namespace std;

class derivedClass;
class baseClass
{
public:
    int objID;
    derivedClass* dcObjPtr;

    baseClass()
    {
        cout << "(1) Default constructor" << objID << endl;
    }

    baseClass(int ID);

};

class derivedClass : public baseClass
{
public:
    derivedClass()
    {}

    derivedClass(int ID) : baseClass(ID)
    {
        cout << "(4) Constructing derived object with ID: " << objID << endl;
    }
};

baseClass::baseClass(int ID)
{
    objID = ID;
    dcObjPtr = new derivedClass(1);
    cout << "(2) Constructing base object with ID: " << objID << endl;
}

int main(int argc, char** argv)
{
    derivedClass dcObj(1);

    return 0;
}    
于 2015-01-12T14:06:00.310 に答える