#include <iostream>
class Base
{
public:
int id;
};
int main()
{
Base b();
b.id = 1;
}
上記のコードでのオブジェクト作成の何が問題になっていますか? Base b()
とはどう違いBase b
ますか?
#include <iostream>
class Base
{
public:
int id;
};
int main()
{
Base b();
b.id = 1;
}
上記のコードでのオブジェクト作成の何が問題になっていますか? Base b()
とはどう違いBase b
ますか?
これ
Base b();
b()
オブジェクトを返す関数の関数宣言として解析されBase
ます。あなたはこれを必要とします:
Base b;
これにより、オブジェクトがインスタンス化され、Base
そのデフォルト コンストラクターが呼び出されます。これは初期化をゼロにしないことに注意してくださいbase::id
。これを行うデフォルトのコンストラクターを提供することで、これを修正できます。
class Base
{
public:
Base() : id(0) {}
int id;
};
同じ方法でインスタンス化します。
Base b;
問題は、オブジェクトをインスタンス化するのではなく、関数を宣言していることです。これ:
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)