我无法让编译器接受我的下面定义的用户数据类型(Term),该用户数据类型接受另一个用户数据类型(Rational)作为参数。关于如何使这项工作的任何建议都会很棒!
#ifndef _TERM_H
#define _TERM_H
#include "Rational.h"
using namespace std;
class Term {
public:
//constructors
Term( const Rational &a, const int &b)
{
this->coefficient = a;
this->exponent = b;
}
Term(){}
~Term () {}
//print the Rational
void print()const
{
cout << coefficient << " x^" << exponent << endl;
}
private:
Rational *coefficient, *a;
int exponent, b;
};
#endif
#ifndef _TERM_H
#define _TERM_H
using namespace std;
class Rational {
public:
//constructors
Rational( const int &a, const int &b){
if (a != 0)
if (b != 0)
this->numerator = a;
this->denominator = b;
}
//print the Rational
void print()const {
cout << numerator << "/" << denominator << endl;
}
//add 2 Rationals
void add(const Rational &a, const Rational &b){
numerator = ((a.numerator * b.denominator)+(b.numerator*a.denominator));
denominator = (a.denominator*b.denominator);
}
...
private:
int a, b, numerator, denominator;
};
#endif
我一直收到以下错误消息。
Term.h(30):错误C2440:'=':无法从'const Rational'转换为'Rational *' 1 GT;没有可用于执行此转换的用户定义转换运算符,或者无法调用运算符 ==========构建:0成功,1个失败,0个最新,0个跳过==========
答案 0 :(得分:1)
你的问题是,Term::coefficient
具有类型Rational*
(指向Rational的指针),并且在构造函数中,您尝试将类型Rational
的值分配给该成员变量。
所以正确的构造函数如果你想保持其余的完整,就像这样:
Term(const Rational& a, int b) : coefficient(&a), exponent(b) {}
或者您可以保持构造函数不变并更改私有部分:
private:
Rational coefficient;
// the rest of the member variables
答案 1 :(得分:1)
首先,将coefficient
的定义更改为:
const Rational& coefficient;
然后将构造函数更改为:
Term (const Rational& a, const int& b)
: coefficient (a), exponent (b)
{
}
答案 2 :(得分:0)
void print() const
{
cout << *coefficient << " x^" << exponent << endl;
}
你是不是错过了那里的解除引用算子?
答案 3 :(得分:0)
您似乎在两个不同的头文件中使用相同的包含警戒名称(_TERM_H
)。这非常糟糕 - 您需要在项目中的所有文件中使包含保护名称唯一,否则包含一个文件将阻止另一个文件。特别是,如果我正确地阅读了你的代码,你就有了这个:
#ifndef _TERM_H
#define _TERM_H
#include "Rational.h"
Rational.h有这个:
#ifndef _TERM_H
#define _TERM_H
这应该意味着当你包含Rational.h时,已经定义了_TERM_H
,所以将忽略Rational.h的内容。