2016-05-25 4 views
1
#include <iostream> 

using namespace std; 

class Fam 
{ 
    public: 
     char you, urmom, urdad; 
     void addPerson(char y, char m, char f) 
     { 
      you = y; 
      urmom = m; 
      urdad = f; 
     } 
}; 

class Tree: public Fam 
{ 
    public: 
     void showFamtree() 
     { 
      cout<< "Name: " << you << endl; 
      cout<< "Mother's name: " << urmom <<endl; 
      cout<< "Father's name: " << urdad <<endl; 
     } 
}; 

int main(void) 
{ 
    Tree tree; 

    char a,b,c; 
    cin >> a; 
    cin >> b; 
    cin >> c; 

    tree.addPerson(a,b,c); 

    cout<< "Family tree: " << tree.showFamtree() <<endl; 

    return 0;  
} 

Je voulais imprimer l'arbre généalogique avec la personne le nom, le nom de la mère, le nom du père mais quand je compile, je reçois l'erreur suivante:Pourquoi l'utilisation de ma méthode d'impression avec std :: cout génère-t-elle une erreur?

invalid operands to binary expression (basic_ostream<char, std::char_traits<char> > and void)

+2

S'il vous plaît ne pas étiqueter les langues sans rapport, ce n'est certainement pas C. –

+0

En outre, les citations sont pour les guillemets. pas pour du texte normal. –

+2

J'ai édité votre message pour lui donner un titre qui contient des informations et j'ai inclus un message d'erreur pour votre problème. (Ce dernier a été généré avec clang, vous pouvez le changer pour le message d'erreur que votre compilateur cite si vous le souhaitez.) Pour l'avenir, assurez-vous que vos titres décrivent le problème et que vos messages contiennent des messages d'erreur pertinents. Amusez-vous sur ce site. –

Répondre

2

tree.showFamtree() retours rien (c.-à-void) , ça n'a aucun sens d'essayer de le passer à std::cout. Vous pouvez changer

cout<< "Family tree: " << tree.showFamtree() <<endl; 

à

cout << "Family tree: " << endl; 
tree.showFamtree(); 
1

Si vous définissez operator << comme celui-ci

ostream& operator << (ostream & ostr , const Tree & t){ 
    ostr << "Name:" << t.you << endl 
     << "Mother's name:" << t.urmom << endl 
     << "Father's name:" << t.urdad << endl; 
    return ostr; 
} 

vous pouvez utiliser

cout<< "Family tree: " << tree <<endl; 

Ceci est connu comme operator overloading en C++.

+0

Pourquoi la fonction 'static'? – songyuanyao

+0

Pourquoi le 'static'? € Trop lent. –

+0

Il n'y a pas beaucoup de signification. Je l'enlève. – BLUEPIXY

1

Pour utiliser quelque chose de similaire à ceci:

void showFamtree() 
{ 
    cout<< "Name: " << you << endl; 
    cout<< "Mother's name: " << urmom <<endl; 
    cout<< "Father's name: " << urdad <<endl; 
} 

avec:

cout << "Family tree: " << tree.showFamtree() << endl; 

Une approche C++ serait d'utiliser std :: stringstream, comme dans:

std::string showFamtree() 
{ 
    std::stringstream ss; 
    ss << "Name: " << you << endl; 
    ss << "Mother's name: " << urmom <<endl; 
    ss << "Father's name: " << urdad <<endl; 
    return (ss.str()); 
} 

J'ajoute aussi souvent une étiquette. Pensez à utiliser

std::string showFamtree(std::string label) 
{ 
    std::stringstream ss; 
    ss << label; 
    ss << "Name: " << you << endl; 
    ss << "Mother's name: " << urmom <<endl; 
    ss << "Father's name: " << urdad <<endl; 
    return (ss.str()); 
} 

et changer invocation à

cout << tree.showFamtree("Family tree: ") << endl; 

Remarque - Peut-être que l'étiquette doit être sur sa propre ligne, pour l'espace blanc cohérent sur la gauche du « arbre ».