用户定义的数据类型,它使用另一个用户定义的数据类型作为参数

时间:2010-11-28 11:23:16

标签: c++

我无法让编译器接受我的下面定义的用户数据类型(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个跳过==========

4 个答案:

答案 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的内容。