无法将参数 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;
}

如果您想为您的类型定义自定义打印,您可能还需要考虑覆盖输出流运算符。