如果我有以下文件,我会收到此错误(VC9中的c2593)。 如果我在main.cpp中取消注释原型,则错误消失。我需要保持相同的功能,同时保持class不在main.cpp。我怎么能这样做?
感谢。
main.cpp中:
#include "number.h"
//const Number operator + (const Number & lhs, const Number & rhs);
int main(void)
{
Number n1(2); // n1 = 2
Number n2(9,3); // n2 = 3
Number n3 = n1+n2; // n3 = 5
}
number.h:
struct Number
{
int num;
Number(int n=0,int d=1) {num = n/d;}
operator int() {return num;}
operator double() {return num*1.0;}
};
number.cpp:
#include "Number.h"
const Number operator + (const Number & lhs, const Number & rhs)
{
Number tmp;
tmp.num = lhs.num + rhs.num;
return tmp;
}
答案 0 :(得分:4)
尝试将原型放在Number头文件中:
number.h:
struct Number
{
int num;
Number(int n=0,int d=1) {num = n/d;}
operator int() {return num;}
operator double() {return num*1.0;}
};
const Number operator + (const Number & lhs, const Number & rhs);
number.cpp:
#include "Number.h"
const Number operator + (const Number & lhs, const Number & rhs)
{
Number tmp;
tmp.num = lhs.num + rhs.num;
return tmp;
}
main.cpp中:
#include "number.h"
int main(void)
{
Number n1(2); // n1 = 2
Number n2(9,3); // n2 = 3
Number n3 = n1+n2; // n3 = 5
}
答案 1 :(得分:1)
该注释行应该在number.h中。
编辑:在number.h中,但作为自由函数。
答案 2 :(得分:0)
你永远不会在number.h中声明运算符+,你只能在number.cpp中定义 - 因此,当你在main.cpp中包含number.h时,它不知道去哪里找运营商+。
你必须将operator +的声明放在class.h之外的number.h中,然后在number.cpp中定义
答案 3 :(得分:0)
在您回到我们之前使用一个非常相似的问题时,还需要注意您的代码:最好删除operator int
和operator double
函数。他们会让你头疼。我们举几个例子:
Number a, b;
1 + b;
// ambiguous: operator+(int, int) or
// operator+(Number, Number) ?
// did you intend to use those for this case?
float x = a;
// ambiguous: from int -> float or
// double -> float ?
在最初的情况下,您的添加内容含糊不清,因为我们考虑了operator+(double, double)
和operator+(int, int)
个内置运算符,它们同样出色。其他人解决了这个问题但在开始并遇到其他问题之前,最好删除转换函数并插入显式函数,如asDouble
或类似的东西。
答案 4 :(得分:0)
除了在头文件中声明operator +的其他答案之外,我建议你在你的struct中也有operator + =。
struct Number
{
// your other declarations.
Number& operator+=(const Number& other)
{
this->num += other.num;
return *this;
}
};
const Number operator+(const Number& lhs, const Number& rhs)
{
Number ret(lhs);
ret += rhs;
return ret;
}
这样调用x + = y是有效的;而不是x = x + y;
答案 5 :(得分:-1)
就个人而言,我更喜欢在类中声明运算符:
struct Number
{
int num;
Number(int n=0,int d=1) {num = n/d;}
operator int() {return num;}
operator double() {return num*1.0;}
Number operator+(const Number &arg) const;
};
然后:
Number Number::operator+(const Number &arg)
{
...
}