2017-08-13 4 views
0

Je suis un débutant qui essaie d'apprendre en faisant. Je veux envoyer une chaîne de caractères dans une fonction de membre de classe appelée "print()" mais j'obtiens des erreurs. Une fois que cela fonctionne, je peux continuer à écrire plus de fonctions de membre de classe qui fonctionnent avec les données que je les nourris.J'alimente une chaîne de caractères à une fonction de membre de la classe

Pour l'instant j'ai créé une classe qui a une fonction membre 'print'.

class Month 
{ 
public: 
string m_month; 

void print() 
{ 
cout << m_month << endl; 
} 

}; 

Ensuite, j'initialisée 12 mois:

Month month1 = { "January" }; 
Month month2 = { "February" }; 
Month month3 = { "March" }; 
etc. 

Quand j'appelle "month1.print();" il imprime Janvier ce qui est correct.

J'ai utilisé stringstream et une boucle for pour concaténer les mois + 1 à 12 et je veux donner la fonction strings à la fonction d'impression.

stringstream os; 
string mValue = "month"; 
int iValue = 1; 

for(int i = 0; i < 12; ++i) 
{ 
    os << mValue << "" << iValue << "\n"; 
    iValue += 1; 
} 

Cependant, le flux de chaîne ne peut pas être combiné avec la fonction d'impression.

os.print(); and os.str().print(); 

résultat dans "l'erreur: 'std :: stringstream {alias classe std :: __ cxx11 :: basic_stringstream}' n'a pas membre nommé 'print'"

Conversion du stringstream char, puis le nourrir dans les résultats de la fonction d'impression en « erreur: demande de membre « print » dans « CSTR », qui est de type non-classe « const char * » »

const string tmp = os.str(); 
const char* cstr = tmp.c_str(); 

cstr.print(); 

longue histoire courte: Ce que je suis en train de faire concatène le mois + 1 à 12 et le transmet à la fonction membre "print". Cela semble trivial mais je n'arrive pas à le faire fonctionner. Aucune suggestion?

Edit: code complet:

#include <iostream> 
#include <string> 
#include <sstream> 

using namespace std; 

class Month 
{ 
public: 
string m_month; 


void print() 
{ 
cout << m_month << endl; 
} 

}; 

int main() 
{ 
Month month1 = { "January" }; 
Month month2 = { "February" }; 
Month month3 = { "March" }; 
Month month4 = { "April" }; 
Month month5 = { "May" }; 
Month month6 = { "June" }; 
Month month7 = { "July" }; 
Month month8 = { "August" }; 
Month month9 = { "September" }; 
Month month10 = { "October" }; 
Month month11 = { "November" }; 
Month month12 = { "December" }; 

stringstream os; // Initialize stringstream "os" 
string mValue = "month"; // Initialize mValue "month" 
int iValue = 1; // Initialize iValue "1" 

for(int i = 0; i < 12; ++i) 
{ 
os << mValue << "" << iValue << "\n"; // Glue mValue and iValue  
// together 
iValue += 1; // Increment iValue by one 
} 

send stringstream "os" to the print function // mock code: Here I want to send month1.print(); month2.print(); etc. to the print function. The output should be January, February etc. 

return 0; 
} 
+0

Il est difficile de comprendre ce que vous essayez de faire avec 'os.print();'. L'impression n'est pas une méthode de la chaîne de caractères, comme le dit l'erreur. Aviez-vous l'intention d'assigner la chaîne stringstream à 'm_month'? De plus, vous n'utilisez jamais les variables du mois. Je ne suis pas sûr de ce que votre boucle avec iValue est supposée faire. Précisez s'il vous plaît. – Carcigenicate

+0

Attendez, essayez-vous d'obtenir les objets month avec le mValue for-loop? – Carcigenicate

+0

Je n'utilise probablement pas la bonne terminologie ici, mais ce que j'ai fait, c'est que j'ai créé une classe avec les membres 'm_month' et 'print'. J'ai initialisé les mois 1 à 12, donc quand j'appelle 'month1.print();' il imprime 'Janvier'; 'month2.print();' imprime 'février' et ainsi de suite. Pour l'instant, je veux que le programme imprime 'Janvier, Février, Mars, etc' sans avoir à taper 'month1.print(); à month12.print(); C'est à ça que sert la boucle for. Il incrémente et concatène 'month1 à 12' que je veux ajouter à la fonction d'impression. Je vais poster le code complet dans le message original. – TwoGoldFish

Répondre

1

Cela ne fait pas ce que vous pensez qu'elle:

for(int i = 0; i < 12; ++i) 
{ 
    // iValue is actually unnecessary. You could have just used (i + 1) 
    os << mValue << "" << iValue << "\n"; 
    iValue += 1; 
} 

Tout cela ne fait remplir le stringstream avec la chaîne:

"month1\nmonth2\nmonth3\nmonth4\nmonth5\nmonth6\nmonth7\nmonth8\nmonth9\nmonth10\nmonth11\nmonth12" 

Votre intention semblait être de concaténer un nombre à la fin d'une chaîne "month", et les faire agir comme e e month1, month2 ... variables que vous avez définies ci-dessus. Ce n'est pas comme ça que ça fonctionne. Vous ne pouvez pas (et ne devriez pas) essayer de "dynamiquement" référencer des variables comme ça. Dans os.print();, la stringstream n'agit pas comme Month simplement parce qu'elle contient une chaîne portant le même nom qu'une variable Month.

Au lieu de cela, ajoutez les variables à une sorte de conteneur (comme un std::vector), et la boucle au-dessus:

std::vector<Month> months{ month1, month2, month3, ..., month12 } 

for (unsigned int i = 0; i < months.size(); i++) 
{ 
    months[i].print(); 
} 
+0

"Votre intention semblait être de concaténer un nombre à la fin d'une chaîne" mois ", et les faire agir comme les variables month1, month2 ... que vous avez définies ci-dessus ..." Oui, c'est mon intention. Merci d'avoir suggéré d'utiliser un vecteur std :: pour ça. Je vais essayer. Je viens d'un arrière-plan Powershell avec un état d'esprit «automatiser toutes les choses». Une autre raison de créer dynamiquement les variables est de garder mon code concis en évitant la redondance. – TwoGoldFish

+0

@TwoGoldFish Si vous devez référencer une variable par un nombre, placez-la dans un conteneur indexé (comme un 'vecteur') et faites-y référence par index. Si vous avez besoin de vous y référer par quelque chose d'autre qu'un numéro, placez-le dans une Carte et recherchez-le par clé. Je ne connais pas PowerShell, mais si ce que vous essayez de faire est une pratique courante dans PS, vous devrez changer votre façon de penser. Afaik, sauf si vous compilez avec des drapeaux de débogage, vous perdrez toutes les informations de nom quand il est compilé de toute façon, donc ce n'est même pas possible en C++. – Carcigenicate

+0

Vous pouvez également utiliser une HashMap, qui gère tout, même si elle ne donne pas nécessairement les meilleures performances. Regardez les structures de la bibliothèque standard. Il y a beaucoup d'options pour gérer des situations comme celle-ci. – Carcigenicate

0

Un stringstream doit être considéré comme un cours d'eau comme les autres, sauf qu'il arrive être texte et tenu en mémoire. Donc, il est peu coûteux de le convertir en une chaîne, et en fait, ils sont souvent utilisés pour construire des chaînes.

Mais une méthode "Print" d'une classe n'a pas d'intérêt sachant qu'un flux est un train de chaînes.Tout ce qu'il faut prendre en compte, c'est qu'il reçoit un flux qui est du texte, et qui est entré. En fait, le premier est un peu difficile à appliquer en raison de faiblesses historiques qui remontent loin. Si vous venez de lire l'octet de flux par octet, passez à std :: cout, et terminez sur EOF alors c'est probablement OK.