-2
votes

Ne peut pas surcharger l'opérateur << pour une classe de ma propre classe

J'essaie de réduire la redondance du code à l'aide de la surcharge d'un opérateur de sortie vers un flux au lieu de fonctions d'impression.

                ^


1 commentaires

Le problème est que vous avez défini le <<< / code> surcharger un mainwind et l'opérande de gauche de ce <<< / code> L'opérateur n'est pas un < Code> Mainwind . C'est un mainwind * .


3 Réponses :


3
votes

Vous avez surchargé <<< / code> sur MAINWND pas MAINWND * .

* mainwind << qstring ("str");

Aussi vous voulez qstring const &


6 commentaires

Et si je veux utiliser le pointeur encore? sans le "*" au début. C'est possible? Comment devrais-je changer la surcharge?


@Vlad, vous pouvez utiliser mainwind-> opérateur << (qstring ("str"));


@Vlad, c'est pourquoi vous devez utiliser * mainwind << ...


@Rsahu Pourriez-vous examiner les questions ajoutées à la question ci-dessus, où il est indiqué que le pointeur est attendu comme premier op.Il y a une surcharge de fonction, pas une méthode.


@Vlad, essayez de faire le deuxième argument qstring const & str .


@vlad poser une autre question en utilisant "Posez une question". Invalidation des réponses existantes aux questions valides est fronçée.



5
votes

Vous devez utiliser * mainwind . Le LHS doit être un objet, pas un pointeur.

En cela, je vous recommande fortement de changer la fonction pour renvoyer une référence à l'objet, pas un pointeur. P > xxx pré>

et la mise en oeuvre sur p> xxx pré>

qui vous permettra de chaîner l'opérateur. P>

*mainWind << QString("str") << QString("Second string");


2 commentaires

C'est bien, mais je dois travailler avec exactement le pointeur, mais la surcharge de fonction indiquée ci-dessus me donne un résultat similaire au passé.


@Vlad, en utilisant des pointeurs au lieu d'objets est un choix. Je suis sûr que ce n'est pas une exigence. A plus que les opérateurs <<< / code> ne sont pas idiomatiques. Juste quelque chose à penser.



1
votes
//other.cpp version 2

MainWind *mainWind  = new MainWind;
*mainWind <<"str";

// this will work too

*mainWind << "str" << "another str";  

//   note reliance on cleaning up mainWind to avoid a memory leak

delete mainWind;   

6 commentaires

Beaucoup de texte a peu de sens ... Comment puis-je surcharger la fonction comme en plus de ma question?


Je voudrais utiliser le pointeur sans le "*". Par conséquent, je veux surcharger la fonction.


Votre exemple de surcharge de fonction Résultat Résultat Erreur: MainWind * MW = Nouveau Mainwind; mw << "str"; C'est pour votre dernière aperçu? Peut-être que je ne l'utilise pas correctement?


@vlad - Ouais, d'accord. J'ai oublié cette surcharge de l'opérateur global << () pour accepter les arguments du pointeur (comme le premier argument) n'est pas autorisé. Édité en conséquence. En bref: il n'y a pas de solution à votre condition.


Compilation du code de fonction (avec le premier paramètre que le pointeur) est le succès normal, cela signifie une erreur d'utilisation ... mais où? Mainwind * MW = nouveau main-d'œuvre principal; MW << "str"


La fonction peut compiler, cependant, il n'ya aucun moyen que cela puisse être appelé lors du fait de MW << "str" ​​. S'il y a une version membre de mainwind :: opérateur << () alors * mw << "str" ​​ est implicitement traduit à un appel de quelque chose comme ( * MW) .Mainwind :: opérateur << ("str") . Toutefois, la norme spécifie aucune équivalence qui permet à ce que vous voulez. Tourner MW << "str" ​​ dans un appel de n'importe quel MAINWIND :: opérateur << () . En bref, vous essayez de faire quelque chose que la norme ne supporte pas / autoriser. Le plus proche que vous puissiez venir est le (moche) mw-> opérateur << ("str") (c'est-à-dire que vous voulez que le compilateur fasse).