2010-11-28 6 views
0

Je n'arrive pas à obtenir que le compilateur accepte mon type de données utilisateur (Term) défini ci-dessous qui accepte un autre type de données utilisateur (Rational) en tant que paramètre. Toutes les suggestions sur la façon de faire ce travail serait génial!Type de données défini par l'utilisateur qui utilise un autre type de données défini par l'utilisateur en tant que paramètre

#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 

Je continue de recevoir les messages d'erreur ci-dessous.

Term.h (30): erreur C2440: '=': impossible de convertir 'const rationnel' en 'rationnel' ' 1> Aucun opérateur de conversion défini par l'utilisateur disponible pour effectuer cette conversion, ou l'opérateur ne peut pas être appelé ========== Construire: 0 réussi, 1 a échoué, 0 mise à jour, 0 sautées ==========

+0

Veuillez mettre en retrait votre code correctement. Cela nous facilite beaucoup la lecture et l'aide. –

+0

N'utilisez JAMAIS 'using namespace std;' dans un en-tête. D'ailleurs, n'utilisez jamais un 'using xyz :: abc;' non plus! Chaque fichier qui inclut cet en-tête sera sujet aux conflits d'espace de noms. – rubenvb

Répondre

1

D'abord, modifier la définition de coefficient à ceci:

const Rational& coefficient; 

changer ensuite les inconvénients tructor à ceci:

Term (const Rational& a, const int& b) 
    : coefficient (a), exponent (b) 
{ 
} 
+0

Okay a refait la classe Term et a ajouté un opérateur surchargé pour '=', mais il me donne toujours des idées vides?Voir ci-dessous: – Mike

+0

classe terme { public: \t \t Terme (const Rational & a, const int & b) \t: coefficient (a), exposant (b) \t { \t} \t // Terme() {} \t ~ (terme) {} // \t coefficient \t setCoefficient void (const Rational & a) { \t \t coefficient = a; \t} \t \t const { getCoefficient() chaîne \t \t \t coefficient de rendement; \t} // \t exposant \t setExponent void (const int & b) { \t \t exposant = b; \t} \t \t \t chaîne getExponent() const { \t \t exposant de retour; \t} // \t imprimer le terme \t void print() const { \t \t Cout << << getCefficient "x ^" << getExponent << endl; \t} \t \t privé: \t const Rationnel et coefficient; \t // Rationnel * a; \t exposant int, b; }; #endif – Mike

+0

OK. . . Je ne peux pas lire le code ci-dessus moi-même. Ce que j'essayais de montrer, c'est que j'ai suivi votre suggestion et changé la façon dont mon constructeur est mis en place. J'ai aussi ajouté un opérateur surchargé: – Mike

0
void print() const 
{ 
    cout << *coefficient << " x^" << exponent << endl; 
} 

êtes-vous ne pas manquer un opérateur de déréférencement là?

1

votre problème est que Term::coefficient est de type Rational* (pointeur vers Rational) et dans le constructeur que vous essayez d'attribuer une valeur de type Rational à cette variable membre.

Ainsi, le constructeur correct serait, si vous voulez garder le reste intact, comme celui-ci:

Term(const Rational& a, int b) : coefficient(&a), exponent(b) {} 

Ou vous pouvez laisser le constructeur intact et changer la section privée:

private: 
    Rational coefficient; 
    // the rest of the member variables 
0

Il semble que vous utilisez le même inclure le nom de garde (_TERM_H) dans deux fichiers d'en-tête différents. C'est très mauvais - vous devez rendre le nom de garde d'inclusion unique parmi tous les fichiers de votre projet, sinon l'inclusion d'un fichier bloquera l'autre. En particulier, si je lis votre code correctement, vous avez ceci:

#ifndef _TERM_H 
#define _TERM_H 
#include "Rational.h" 

Et Rational.h a ceci:

#ifndef _TERM_H 
#define _TERM_H 

Cela devrait signifier que lorsque vous incluez Rational.h, _TERM_H est déjà défini , donc le contenu de Rational.h sera ignoré.

Questions connexes