无法将参数 1 从 'Object *' 转换为 'const int
Cannot convert argument 1 from 'Object *' to 'const int
我想创建一个简单的程序来演示它的用法。我写了一个打印 x 和 y 成员变量的函数。我在文件顶部定义了函数。我实际上什至不知道为什么需要这样做,但没关系。到目前为止,一切都很好。 Visual Studio 发现零个问题,没有警告也没有错误。但是,当我编译此代码时,出现以下错误消息:
1>D:\Dev\Visual Studio Projekte\Projektmappe\FirstProject\src\This.cpp(3,30): error C2143: syntax error: missing ',' before '*'
1>D:\Dev\Visual Studio Projekte\Projektmappe\FirstProject\src\This.cpp(11,1): error C2664: 'void PrintObject(const int)': cannot convert argument 1 from 'Object *' to '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
,所以编译器不知道它是什么。在声明此函数之前,您必须先声明 class。 从技术上讲,它们可以同时声明,但这不是很流行的样式。
I also got the error that no default constructor is defined. However the compiler does provide one right?
没有提供。仅为 class 提供默认构造函数,没有用户声明的构造函数(并且没有非默认可构造的子对象)。
这很简单,您在声明它之前就使用了 Object
。所以编译器在读取 PrintObject
.
的声明时并不知道 Object
是什么
两种可能的解决方案。
1) 将PrintObject
的声明移到Object
.
的定义之后
class Object
{
...
};
void PrintObject(const Object* o);
2) 使用前向声明告诉编译器Object
是class.
的名称
class Object; // forward declaration
void PrintObject(const Object* o);
class Object
{
...
};
PrintObject 可以定义为成员函数。会使语法更好。
#include <iostream>
class Object {
public:
Object(int x, int y)
: x(x), y(y) {
PrintObject();
}
int GetX() const {
return this->x;
}
int GetXy() const {
return x;
}
void PrintObject() const {
std::cout << x << ", " << y << std::endl;
}
private:
int x, y;
};
int main() {
Object o{5,6};
return 0;
}
如果您想为您的类型定义自定义打印,您可能还需要考虑覆盖输出流运算符。
我想创建一个简单的程序来演示它的用法。我写了一个打印 x 和 y 成员变量的函数。我在文件顶部定义了函数。我实际上什至不知道为什么需要这样做,但没关系。到目前为止,一切都很好。 Visual Studio 发现零个问题,没有警告也没有错误。但是,当我编译此代码时,出现以下错误消息:
1>D:\Dev\Visual Studio Projekte\Projektmappe\FirstProject\src\This.cpp(3,30): error C2143: syntax error: missing ',' before '*'
1>D:\Dev\Visual Studio Projekte\Projektmappe\FirstProject\src\This.cpp(11,1): error C2664: 'void PrintObject(const int)': cannot convert argument 1 from 'Object *' to '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
,所以编译器不知道它是什么。在声明此函数之前,您必须先声明 class。 从技术上讲,它们可以同时声明,但这不是很流行的样式。
I also got the error that no default constructor is defined. However the compiler does provide one right?
没有提供。仅为 class 提供默认构造函数,没有用户声明的构造函数(并且没有非默认可构造的子对象)。
这很简单,您在声明它之前就使用了 Object
。所以编译器在读取 PrintObject
.
Object
是什么
两种可能的解决方案。
1) 将PrintObject
的声明移到Object
.
class Object
{
...
};
void PrintObject(const Object* o);
2) 使用前向声明告诉编译器Object
是class.
class Object; // forward declaration
void PrintObject(const Object* o);
class Object
{
...
};
PrintObject 可以定义为成员函数。会使语法更好。
#include <iostream>
class Object {
public:
Object(int x, int y)
: x(x), y(y) {
PrintObject();
}
int GetX() const {
return this->x;
}
int GetXy() const {
return x;
}
void PrintObject() const {
std::cout << x << ", " << y << std::endl;
}
private:
int x, y;
};
int main() {
Object o{5,6};
return 0;
}
如果您想为您的类型定义自定义打印,您可能还需要考虑覆盖输出流运算符。