与运营商不匹配*

Ton*_*y_M 2 c++

我正在阅读Effective C++(Scott Meyers),并在尝试编译本书中的以下代码时得到错误"与运算符*不匹配":

rational.h

class rational
{
    private:
        int num;
        int den;
    public:
        rational(int n = 0, int d = 1);
        int getNum() const {return num;}
        int getDen() const {return den;}
};
Run Code Online (Sandbox Code Playgroud)

rational.cpp

#include "rational.h"

rational::rational(int n,
                    int d)
    :num(n),
     den(d)
{}

const rational operator*(const rational &lhs, 
                         const rational &rhs)
{
    return  rational( lhs.getNum()*rhs.getNum(),
                      lhs.getDen()*rhs.getDen() );
}
Run Code Online (Sandbox Code Playgroud)

main.cpp中

#include "rational.h"
int main()
{
    rational r1(1,2);
    rational r2;
    r2 = 2*r1;
    r2 = r1*3;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么会这样吗?

Seb*_*ach 5

您忘了告诉您的用户您的运营商是否存在:

rational.h

...
const rational operator*(const rational &lhs, 
                         const rational &rhs);
...
Run Code Online (Sandbox Code Playgroud)

通常,在C语言和C++中,我们都谈论"定义"和"声明".声明是使某些东西对其他人可见的注释,但它本身却什么都不做.定义是实际做某事的权利:

int foo();              // <- we call it "declaration"
int foo() { return 0; } // <- we call it foo's "definition"
Run Code Online (Sandbox Code Playgroud)

在你的代码中,operator*main.cpp中没有可见的声明,所以你需要在某个地方提供一个声明(理想情况下在你的理性标题中).

作为样式建议:在几乎所有情况下,如果构造函数采用内置类型,您希望将其显式化:

explicit rational (int, int);
Run Code Online (Sandbox Code Playgroud)

这有时可以防止出现细微的错误,因为(在您的情况下)rational可能会无意中创建(请参阅自动转换).

  • @Sogger:非常谨慎地搜索`explicit`关键字:( (2认同)