2011-07-01 4 views
46

クラス型を持っている必要がありますし、私が捕まってしまった私は、この単純なスニペット発現は、私はいくつかの時間のためにC++でコーディングされたhave't

#include "iostream" 
using namespace std; 

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" 
system("pause"); 
} 
+0

"これはありません"と表示されている行は実際には問題なく、あなたの質問は混乱しています。 – juanchopanza

答えて

105

それはポインタですがコンパイルしようとしたとき、その代わりに試してみてください。

a->f(); 

基本的にオペレータ.ので、オブジェクトおよび参照に使用されている(オブジェクトのフィールドとメソッドにアクセスするために使用される):

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

あなたはポインタ型を持っている場合、あなたはそれ最初の参照を取得する逆参照する必要があります。

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

a->b表記は通常(*a).bのためだけの省略形です。

+0

ちょうどC++を始めるには、ポインタや参照を使うかどうかを判断する自動化をしなければなりません。私の特別なケースでは、私が必要としていたのはリファレンスでしたが、何らかの理由でポインタを渡しました。とにかく、明らかに説明してくれてありがとう! –

6

概要:代わりa.f();のそれはあなたが->演算子を使用しての機能にアクセスできるようにあなたは、オブジェクトへのポインタとしてを定義しているメインでa->f();

でなければなりません。

a.f()はFを(アクセスするために使用されている可能性)としてが宣言された場合:

A a;
4

aがポインタです。 ->を使用する必要があります。.

11

分析を許可します。経験則として

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. 

:あなたが自分でメモリを管理する必要がある場合は、superiourマネージャまたはすでに利用可能な代替が一般的に存在し、1次の一般的なアドバイスとして

#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. 
} 

RAIIの原理。