【问题标题】:Cannot convert argument 1 from 'Object *' to 'const int无法将参数 1 从 'Object *' 转换为 'const int
【发布时间】:2020-03-19 21:34:30
【问题描述】:

我想创建一个简单的程序来演示它的用法。我编写了一个打印 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诠释'

现在在某些时候我也得到了没有定义默认构造函数的错误。但是编译器确实提供了一种权利吗?然后我只是重新输入了代码,错误就消失了。只是我想提的那件事似乎也很愚蠢。 那么为什么编译器认为“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;
}

【问题讨论】:

  • 你可能想要实现 operatorhttps://docs.microsoft.com/en-us/cpp/standard-library/overloading-the-output-operator-for-your-own-classes?view=vs-2019

标签: c++ this


【解决方案1】:
void PrintObject(const Object* o);

你还没有声明Object,所以编译器不知道它是什么。在声明这个函数之前,你必须首先声明这个类。 从技术上讲,它们可以同时声明,但这不是很流行的样式。

我也得到了没有定义默认构造函数的错误。但是编译器确实提供了一个对吗?

它没有提供一个。默认构造函数仅提供给没有用户声明的构造函数(并且没有非默认可构造子对象)的类。

【讨论】:

    【解决方案2】:

    这很简单,您在声明它之前使用Object。所以编译器在读取PrintObject的声明时并不知道Object是什么。

    两种可能的解决方案。

    1) 将PrintObject 的声明移到Object 的定义之后。

    class Object
    {
        ...
    };
    
    void PrintObject(const Object* o);
    

    2) 使用前向声明告诉编译器Object 是一个类的名称。

    class Object; // forward declaration
    
    void PrintObject(const Object* o);
    
    class Object
    {
        ...
    };
    

    【讨论】:

    • 感谢您的帮助。我只是认为如果我总是必须声明一些东西然后定义它,这真的会弄乱代码。看起来很多代码非常相似,也没有真正做任何事情。
    • @Nicky 自 C 时代以来,声明和定义一直是这种方式。我想原因是为了减少编译器必须做的工作量,这在 C 语言出现时是一个重要的考虑因素发明的。这并不理想,但你习惯了。
    【解决方案3】:

    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;
    }
    

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

    【讨论】:

      猜你喜欢
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 2018-11-25
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 2020-04-04
      相关资源
      最近更新 更多