2009-05-26 6 views
1

Pardonne ce qui pourrait sembler à certains d'être une question très simple, mais je dois ce cas, utilisez à l'esprit:Question sur l'opérateur d'affectation en C++

struct fraction { 
    fraction(size_t num, size_t denom) : 
     numerator(num), denominator(denom) 
    {}; 
    size_t numerator; 
    size_t denominator; 
}; 

Ce que je voudrais faire est de déclarations d'utilisation comme:

fraction f(3,5); 
... 
double v = f; 

d'avoir v détiennent maintenant la valeur représentée par ma fraction. Comment ferais-je cela en C++?

+2

Pourquoi utilisez-vous size_t? Pourquoi ne pas utiliser int signé ou long? Aussi, que se passe-t-il si quelqu'un veut une fraction négative? Vous pourriez vouloir ajouter un signe booléen à moins que vous ne soyez prêt à faire signer le numérateur ou le dénominateur (ou les deux). –

Répondre

7

Une façon de le faire est de définir un opérateur de conversion:

struct fraction 
{ 
    size_t numerator; 
    size_t denominator; 

    operator float() const 
    { 
    return ((float)numerator)/denominator; 
    } 
}; 

La plupart des gens préfèrent ne pas définir un opérateur de conversion implicite comme une question de style. En effet, les opérateurs de conversion ont tendance à agir en coulisse et il peut être difficile de déterminer quelles conversions sont utilisées.

struct fraction 
{ 
    size_t numerator; 
    size_t denominator; 

    float as_float() const 
    { 
    return ((float)numerator)/denominator; 
    } 
}; 

Dans cette version, vous appelez la méthode as_float pour obtenir le même résultat.

+0

cette division intégrale me prend toujours –

+0

C'est un autre de ces G/C++ gotchas. +1 pour as_float cependant. C'est la même raison pour laquelle il y a c_str() sur std :: string. C'est trop facile de vous mettre dans le pétrin avec des conversions implicites. Bien que pour un cas numérique comme celui-ci, cela pourrait bien aller. – Eclipse

+0

Merci. J'ai utilisé la double version de votre opérateur float() const. – Carl

1

operator= n'a rien à voir avec elle, plutôt que vous voulez ajouter à votre struct une operator double publique quelque chose comme:

operator double() { 
    return ((double) numerator))/denominator; 
} 
+0

Vous avez raison, c'est juste 'operator double() {' & c. –

+0

édité pour corriger la syntaxe (pensée que je l'avais déjà eu mais clairement pas, désolé) –

0

Avec autant de code, il s'agira d'une erreur de compilation car le compilateur ne sait pas comment convertir une fraction de structure en un double. Si vous voulez fournir la conversion, vous devez définir le operator double() qui sera utilisé par le compilateur pour cette conversion.

2

Vous pouvez utiliser le double opérateur pour convertir:

struct fraction 
{ 
    operator double() const 
     { 
     //remember to check for denominator to 0 
      return (double)numerator/denominator; 
     } 
}; 
3

Opérateurs d'affectation et les constructeurs de conversion sont pour initialiser les objets de votre classe d'objets d'autres classes. Vous avez plutôt besoin d'un moyen d'initialiser un objet d'un autre type avec un objet de votre classe. Voilà à quoi sert un opérateur de conversion:

struct fraction { 
    //other members here... 
    operator double() const { return (double)numerator/denominator;} 
    //other members here... 
};