式にはクラスタイプが必要です


82

私はしばらくの間C ++でコーディングしておらず、この単純なスニペットをコンパイルしようとすると行き詰まりました。

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

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

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

2
「これはできません」という行は実際には問題ないため、質問が混乱しているように見えます。
juanchopanza 2011

回答:


166

これはポインタなので、代わりに次のことを試してください。

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();

C ++を始めたばかりですが、ポインターと参照のどちらを使用するかを判断するための自動化を行う必要があります。私の特定のケースでは、必要なのは参照だけでしたが、何らかの理由で代わりにポインターを渡しました。とにかく、明確な説明をありがとう!
ギヨームM

13

分析を許可します。

#include <iostream>   // not #include "iostream"
using namespace std;  // in this case okay, but never do that in header files

class A
{
 public:
  void f() { cout<<"f()\n"; }
};

int main()
{
 /*
 // A a; //this works
 A *a = new A(); //this doesn't
 a.f(); // "f has not been declared"
 */ // below


 // system("pause");  <-- Don't do this. It is non-portable code. I guess your 
 //                       teacher told you this?
 //                       Better: In your IDE there is prolly an option somewhere
 //                               to not close the terminal/console-window.
 //                       If you compile on a CLI, it is not needed at all.
}

一般的なアドバイスとして:

0) Prefer automatic variables
  int a;
  MyClass myInstance;
  std::vector<int> myIntVector;

1) If you need data sharing on big objects down 
   the call hierarchy, prefer references:

  void foo (std::vector<int> const &input) {...}
  void bar () { 
       std::vector<int> something;
       ...
       foo (something);
  }


2) If you need data sharing up the call hierarchy, prefer smart-pointers
   that automatically manage deletion and reference counting.

3) If you need an array, use std::vector<> instead in most cases.
   std::vector<> is ought to be the one default container.

4) I've yet to find a good reason for blank pointers.

   -> Hard to get right exception safe

       class Foo {
           Foo () : a(new int[512]), b(new int[512]) {}
           ~Foo() {
               delete [] b;
               delete [] a;
           }
       };

       -> if the second new[] fails, Foo leaks memory, because the
          destructor is never called. Avoid this easily by using 
          one of the standard containers, like std::vector, or
          smart-pointers.

経験則として、メモリを自分で管理する必要がある場合は、通常、RAIIの原則に従った、優れたマネージャーまたは代替のマネージャーがすでに利用可能です。


9

概要:の代わりにa.f();それでなければなりませんa->f();

主にAのオブジェクトへのポインタとしてaを定義ているので、演算子を使用して関数にアクセスできます。 ->

代替、あまり読みやすい方法です(*a).f()

a.f()aが次のように宣言されている場合 f()へのアクセスに使用できます。 A a;


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.