dodo7263
Messages postés616Date d'inscriptionmercredi 10 septembre 2008StatutMembreDernière intervention 9 février 2017
-
30 sept. 2014 à 15:13
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023
-
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....
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 ?
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("", ""))
dodo7263
Messages postés616Date d'inscriptionmercredi 10 septembre 2008StatutMembreDernière intervention 9 février 20176 1 oct. 2014 à 09:23
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.
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 1 oct. 2014 à 10:43
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;
}