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 回答
0

编译错误源于您在cout语句中取消引用指向 B 的指针这一事实。为此,编译器此时必须具有可用的类 B 的定义。

换句话说,像这样的代码

pointerToB->x

仅当您#include "B.h"在该点之前具有该值时才有效。

因此,您可以在 中执行此操作A.h,或者,为了避免这种额外的耦合(以及避免大的头文件),您可能希望将这些带有指针解引用的片段移动到 中A.cpp并前向声明类 B A.h正如 Luchian 建议的那样

于 2017-07-20T14:55:10.543 回答
-1

我会先尝试添加括号:

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

对此:

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

我认为它只是这样简单的事情,并且 cout 试图在箭头运算符之前首先“获取” B* 对象。如果不是这样,请发布编译器错误消息。

于 2012-04-16T16:53:48.650 回答