1. ホーム
  2. c++

[解決済み] 式はクラス型を持つ必要があります。

2022-01-23 03:37:21

質問

しばらくc++でコーディングしていなかったので、この簡単なスニペットをコンパイルしようとしたら、行き詰ってしまいました。

class A
{
  public:
    void f() {}
};

int main()
{
  {
    A a;
    a.f(); // works fine
  }

  {
    A *a = new A();
    a.f(); // this doesn't
  }
}

解決方法は?

ポインターなので、代わりに試してみてください。

a->f();

基本的に演算子 . (オブジェクトのフィールドやメソッドにアクセスするために使われる) は、オブジェクトとリファレンスに対して使われるので。

A a;
a.f();
A& ref = a;
ref.f();

ポインタ型の場合、参照を得るにはまず参照を解除する必要があります。

A* ptr = new A();
(*ptr).f();
ptr->f();

a->b という表記は、通常、単なる略語で (*a).b .

スマートポインタの注意点

operator-> はオーバーロードが可能で、特にスマートポインターで使用されています。この場合 スマートポインターを使用している場合 を使用すると、さらに -> を使用して、ポイントされたオブジェクトを参照します。

auto ptr = make_unique<A>();
ptr->f();