2

ここに私の問題があります:私は2つの異なるクラスAとBで作業しています。クラスAにはタイプBのオブジェクトへのポインターのベクトルが含まれており、このベクトルを関数myfuncで使用したいと考えています。これはAのメンバーです。例

class B {

public:

int x, y;

float z;

// other class members...

};



class A {

public:

// other class members...

vector <B*> myvect;

float myfunc() {


for(size_t i = 0; i < myvect.size(); ++i) cout << myvect[i] -> x << endl;

// rest of the code...

return (some float)

}

};

プログラムはコンパイルされません。B が未定義の型であるというエラーを返します。cout ステートメントをコメントアウトした場合にのみコンパイルされます。私はインターネットを検索し、 i をイテレータとして宣言したり、イテレータを逆参照したりするなど、いくつかのことを試しましたが、何も機能しませんでした。このコードの何が問題なのですか?

4

3 に答える 3

1

#include "B.h"内部A.hで、またはより正しい方法で、class Bの定義の前に前方宣言をA行い、実装をヘッダーの外部に移動できます。

//B.h
class B
{
//...
};

//A.h
class B; //forward declaration
class A
{
    //...
    vector <B*> myvect;  // <- correct syntax
    float myfunc();      // only declaration
    //...
};

//A.cpp
#include "A.h"
#include "B.h"

//...
float A::myfunc() { //implementation
   for(size_t i = 0; i < myvect.size(); ++i) cout << myvect[i] -> x << endl;
   // rest of the code...
   return (some float)
}
//..
于 2012-04-16T16:49:16.010 に答える
-1

最初に括弧を追加してみます:

cout << myvect[i] -> x << endl;

これに:

cout << ((myvect[i]) -> x) << endl;

私はそれがそのような単純なものであり、その cout が矢印演算子の前に B* オブジェクトを最初に「取得」しようとしている可能性が高いと考えています。そうでない場合は、コンパイラ エラー メッセージを投稿してください。

于 2012-04-16T16:53:48.650 に答える