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 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 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 

Votre réponse

3 réponses

Meilleure réponse
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - Modifié par cptpingu le 30/09/2014 à 17:33
1
Merci
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

Merci cptpingu 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de cptpingu
Meilleure réponse
dodo7263 642 Messages postés mercredi 10 septembre 2008Date d'inscription 9 février 2017 Dernière intervention - 1 oct. 2014 à 09:23
1
Merci
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

Merci dodo7263 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de dodo7263
Meilleure réponse
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - 1 oct. 2014 à 10:43
1
Merci
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

Merci cptpingu 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

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.