我想创建一个简单的程序来演示此用法。我写了一个打印x和y成员变量的函数。我在文件顶部定义了函数。我什至根本不知道为什么需要这样做,但是还可以。到目前为止,一切都很好。 Visual Studio发现零问题,没有警告,也没有错误。但是,当我编译此代码时,出现以下错误消息:
1> D:\ Dev \ Visual Studio Projekte \ Projektmappe \ FirstProject \ src \ This.cpp(3,30):错误C2143:语法错误:在'*'之前缺少','1> D:\ Dev \ Visual Studio Projekte \ Projektmappe \ FirstProject \ src \ This.cpp(11,1):错误C2664:'void PrintObject(const int)':无法将参数1从'Object *'转换为'const int'
现在,在某些时候,我还得到一个错误,即未定义默认构造函数。但是编译器确实提供了一种权利吗?然后,我简单地重新输入代码,错误消失了。我想提的那件事似乎也很愚蠢。那么,为什么编译器实际上是在引用我的对象时认为“ this”是在引用“ const int”?
#include <iostream>
void PrintObject(const Object* o);
class Object {
public:
int x, y;
Object(int x, int y)
: x(x), y(y) {
PrintObject(this);
}
int GetX() const {
return this->x;
}
int GetXy() const {
return x;
}
};
void PrintObject(const Object* o) {
std::cout << o->x << ", " << o->y << std::endl;
}
int main() {
std::cin.get();
return 0;
}
void PrintObject(const Object* o);
您尚未声明Object
,因此编译器无法知道它是什么。在删除此功能之前,必须先声明该类。
非常简单,在声明之前,您正在使用Object
。因此,编译器在读取Object
的声明时并不知道PrintObject
是什么。
两种可能的解决方案。
1)将PrintObject
的声明移到Object
的定义之后。
class Object
{
...
};
void PrintObject(const Object* o);
2)使用转发声明告诉编译器Object
是类的名称。
class Object; // forward declaration
void PrintObject(const Object* o);
class Object
{
...
};