0
namespace chk{

class Car;
        Car abc()
        {
                return Car();
        }

class Car
{
        private:
                int sides;

        public:
                Car()
                {
                        std::cout<<"\ndefault called constructor";
                }
                Car(int nsides)
                {
                        std::cout<<"\ncalled constructor";
                        sides=nsides;
                }

                ~Car()
                {

                        std::cout<<"\nDeleting objext";
                }

};

       /* Car abc()
        {
                return Car();
        }*/
}

上記のコードで次のエラーが発生します:-

check.cpp: In function ‘chk::Car chk::abc()’:
check.cpp:25: error: return type ‘struct chk::Car’ is incomplete
check.cpp:27: error: invalid use of incomplete type ‘struct chk::Car’
check.cpp:24: error: forward declaration of ‘struct chk::Car’


以下の abc() のコメントを外し、abc() の上のコメントを外すと、正常に動作します。c++ が名前空間内でクラスを宣言することを許可していないのはなぜですか?

4

2 に答える 2

1

c++ が名前空間内でクラスを宣言することを許可していないのはなぜですか?

C++ で許可されていないのは、次のような関数を持つことです。

Car abc()
{
    return Car();
}

classCarの定義なし。これが必要な理由は、Cara) オブジェクトのサイズが必要であり、b) クラスのデフォルト コンストラクターへの呼び出しがあるためです。クラス定義がなければ、コンストラクターが存在するかどうかを知る方法はありません。

于 2013-06-22T18:14:04.473 に答える
1

問題は、abc() 関数が Car の完全な定義を必要とすることです。

Car abc() { return Car(); }

特に、これがどのコンストラクターに解決されるかを判断できるように、定義を知っている必要があるという要件があります。

前方宣言は、型へのポインターまたは参照が必要な場合のみをカバーし、内部の詳細を解決する必要がある場合はカバーしません。

使用するコンストラクターを決定することは、内部の詳細です。さらに、コンパイラは、値で返すように、「車」オブジェクトを返すために、そのサイズを知る必要もあります。

これを解決する 1 つの方法は、関数を前方宣言することです。

class Car abc();

class Car { ... };

Car abc() { return Car(); }
于 2013-06-22T18:14:13.897 に答える