2
#include <iostream>

class Base
{
    public:
        int id;
};

int main()
{
    Base b();
    b.id = 1; 
}

上記のコードでのオブジェクト作成の何が問題になっていますか? Base b()とはどう違いBase bますか?

4

2 に答える 2

3

これ

Base b();

b()オブジェクトを返す関数の関数宣言として解析されBaseます。あなたはこれを必要とします:

Base b;

これにより、オブジェクトがインスタンス化され、Baseそのデフォルト コンストラクターが呼び出されます。これは初期化をゼロにしないことに注意してくださいbase::id。これを行うデフォルトのコンストラクターを提供することで、これを修正できます。

class Base
{
    public:
        Base() : id(0) {}
        int id;
};

同じ方法でインスタンス化します。

Base b;
于 2013-03-08T18:33:57.923 に答える
2

問題は、オブジェクトをインスタンス化するのではなく関数を宣言していることです。これ:

Base b(); // Function declaration! (not what you want)

b()型のオブジェクトを返し、Base引数を受け入れない関数を宣言します。したがって、後で member にアクセスしようとするとid、関数にはメンバーがないため、コンパイラはエラーを出力します。

b.id = 1; // ERROR! b is a function, accessing member "id" makes no sense

のインスタンスを作成したい場合はBase、代わりに括弧を削除してください:

Base b; // Object instantiation! (what you want)

C++11 では、統一された初期化構文を使用して、クラスのインスタンスを作成しようとしていたのとほとんど同じ方法で作成できることに注意してください。ただし、括弧の代わりに中括弧を使用します。

Base b{}; // Object instantiation! (what you want, in C++11)
于 2013-03-08T18:34:13.087 に答える