Constructeur et liste d'initialisation [Résolu]

dodo7263 642 Messages postés mercredi 10 septembre 2008Date d'inscription 9 février 2017 Dernière intervention - 30 sept. 2014 à 15:13 - Dernière réponse : cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 18 avril 2018 Dernière intervention
- 1 oct. 2014 à 10:43
Bonjour,

Je souhaiterai initialiser un <vector<pair<string,string> > avec des string vides dans la liste d'initialisation du constructeur de ma classe, comme je peux faire pour d'autres types genre int, double, float etc....

Ainsi dans mon fichier .h je déclare :

std::vector<std::pair<std::string, std::string> > m_pairValues;

et dans le constructeur (fichier .cpp) :

OutputDef::OutputDef() : m_pairValues(" ")

Sauf qu'il n'aime pas le ' (" ") '. J'ai également essayé d'utiliser :

std::make_pair(" ", " ") mais le compilateur m'engueule toujours.

En revanche si, dans ma liste d'initialisation de mon constructeur, je ne mets rien entre parenthèse m_pairValues() pour mon vecteur de pair, cela compile.

Est ce que je m'y prends mal ? Est-ce correct ce que je veux faire ?

Merci d'avance pour vos éventuelles réponses !

SD


Afficher la suite 

3 réponses

Répondre au sujet
cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 18 avril 2018 Dernière intervention - Modifié par cptpingu le 30/09/2014 à 17:33
+1
Utile
Bonjour.

Il y a quelque chose de très suspicieux dans ce que tu me racontes (mais peut être ais-je simplement mal compris).

C'est ceci qui me fait "tilter":
[...] comme je peux faire pour d'autres types genre int, double, float etc....

Si tu dis qu'on peut initialiser un std::vector<int> _tab en faisant: _tab(34), alors c'est de là que vient ton souci. En faisant cela, oui, ça compile, mais ne fera pas ce que tu veux. _tab(34) veut dire que tu pré-alloues 34 cases. Si tu veux allouer une seule case valant 34, il faut faire _tab(1, 34).

De la même manière pour ton souci initial: _tab(1, std::make_pair("", ""))

__________________________________________________________________________________________________
Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cptpingu
dodo7263 642 Messages postés mercredi 10 septembre 2008Date d'inscription 9 février 2017 Dernière intervention - 1 oct. 2014 à 09:23
+1
Utile
Bonjour cptpingu,

En effet, tu n'as pas mal compris, c'est moi qui me suis mal exprimé. Je ne parlais pas de vector<int> etc... mais bien de type simple plutôt.
déclaration :
int m_myint;
constructeur :
MyClass::MyClass() : m_myint(0)

Cependant tu as tout de même répondu à ma question et je t'en remercie. ;-)

P.S : Pour info, comme on a pas mal échangé sur une autre discussion tous les deux il y a quelques jours, j'ai finalement choisi de faire le design de mon code en structure. En effet, je n'ai pas besoin d'avoir des objets complexes puisque je veux juste stocker les données de mon fichier XML. Donc la structure me semble plus adaptée dans ce cas présent comme tu me l'avais suggéré.

En revanche, en écrivant mon code, je me suis posé une question qui me fait douter de mon choix. En effet, mes structures se trouvent dans des headers que j'inclus dans mon main(). Du coup est ce que cela ne revient pas à avoir des "variables" globales au sein de mon code? Et je sais qu'il est déconseillé d'en avoir. Je suis en train de réecrire un code fortran90 en c++ qui possède une myriade, que dis-je une fabuleuse quantité de variables globales et ça je n'en veux pas dans ma réecriture.

++

SD
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de dodo7263
cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 18 avril 2018 Dernière intervention - 1 oct. 2014 à 10:43
+1
Utile
Ce n'est pas parce que tu utilises une struct plutôt qu'une classe que les données seront globales. Un objet de classe globale contenant des accesseurs vers des data privées, ou un objet de struct globale contenant des datas publiques, sont équivalents. Les deux objets sont globaux, c'est ça le vrai le souci, et non si leurs attributs sont librements accessibles.

Si tu veux "mapper" un fichier xml en une structure C++, le design de code suivant me parait pas mal (pas de variables globales du tout):

// Tes datas
struct XmlData
{
  bool loadDataFromFile(const std::string& filename);

  int _i;
  // etc
};

class WorkerClass
{
  WorkerClass(/* const */ XmlData& data) // ne pas mettre const si tu veux modifier data
    : _data(data)
  {
  }

  void work()
  {
    // code
  }

  /* const */ XmlData& _data;
};


int main()
{
  XmlData data;
  data.loadDataFromFile("data.xml");

  WorkerClass worker(data);
  worker.work();

  return 0;
}


__________________________________________________________________________________________________
Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cptpingu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.