2010-07-11 12 views
1

Ok, je viens de vb.net en C++. Im essayant d'utiliser des vecteurs dans une structure, mais le compilateur crie à moi pour cela. Quel est le problème avec la déclaration actuelle?Y at-il un problème avec l'utilisation de vecteurs C++ dans les structures?

#include <vector> 

struct FactorSet 
{ 
vector<long long> UpperFactor(0); 
vector<long long> LowerFactor(0); 
}; 

Erreur de sortie (Visual Studio 2008):

Erreur 1 erreur C2059: erreur de syntaxe: 'constante'

Je parierais qu'il est mon manque de compréhension de ce qu'est un vecteur est vraiment . Dans mon esprit c'est un objet, bien que je pense que c'est ce qu'on appelle un modèle. D'autres objets comme les cordes semblent n'avoir aucun problème. Je suppose également que cela est étendu aux définitions de classes, car les structures et les classes sont si similaires.

+6

Vous ne devriez jamais "provenir d'une autre langue". Obtenir un livre et apprendre à partir de la base, l'application des connaissances d'autres langues ne fera que vous embêter. http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – GManNickG

+0

Vous avez raison monsieur, et c'est en fait ce que je fais. Actuellement, j'utilise 'C++, The Complete Reference 4ème édition' de Herbert Schildt comme référence. Parfois, de petits détails, comme le problème auquel je faisais face, ne sont pas abordés dans ces livres. Je suis sûr que j'aurais finalement trouvé la réponse avec plus de lecture. Mais sémantiquement, les écoles de pensée orientées objet et procédurale peuvent être transportées d'une langue à l'autre, non? –

+3

Non, s'il vous plaît, pas Schildt. Généralement considéré comme le pire auteur de livres sur C++ (et C) jamais - Accéléré C++ de la liste que GMan fourni est le chemin à parcourir. –

Répondre

6

Vous voulez:

#include <vector> 

struct FactorSet 
{ 
std::vector<long long> UpperFactor; 
std::vector<long long> LowerFactor; 
}; 

mais vous pourriez aussi avoir des problèmes avec une longue longue, car ce n'est pas actuellement partie de C++.

Si vous voulez vraiment donner une taille aux vecteurs, vous devez le faire via le constructeur de struct:

struct FactorSet 
{ 
std::vector<long long> UpperFactor; 
std::vector<long long> LowerFactor; 

FactorSet() : UpperFactor(42), LowerFactor(42) {} 
}; 

Alors maintenant, quand vous dites:

FactorSet f; 

les vecteurs f Les deux auront la taille 42.

Quant à ce qu'est réellement un vecteur, c'est une classe très semblable à une chaîne, sauf dans le cas du vecteur où vous devez dire quel type de chose il contient. Alors

vector <char> s; 

est très similaire (mais pas identique) à:

string s; 
+0

Wow, c'était rapide. Comme j'essayais de m'initialiser avec une longueur nulle dans la déclaration, je suppose qu'il était traité comme une constante, et les structures et classes ne l'aiment pas en C++. Merci Neil! –

2

Oui, vous pouvez utiliser le vecteur dans une struct ou une classe. Le problème est qu'en C++, vous ne pouvez pas initialiser les membres en ligne; vous devez faire l'initialisation dans le constructeur. Par exemple: »

class FactorSet { 
    public: 
     FactorSet() : UpperFactor(0), LowerFactor(0) {} 
     // ... 
    private: 
     std::vector<int64_t> UpperFactor; 
     std::vector<int64_t> LowerFactor; 
}; 

Juste quelques commentaires ... vecteur, par défaut, être construit avec zéro éléments, il est donc de construire necesary pas explicitement cette façon (en fait, cela pourrait être un peu plus lent que juste en utilisant le constructeur par défaut). En outre, le type long long est actuellement non standard. Envisagez d'utiliser int64_t défini dans stdint.h (et, plus facilement, dans l'en-tête boost/cstdint.hpp).

+0

Merci également pour cet exemple de classe! –

+0

'int64_t' et' stdint.h' ne sont plus standard que 'long long'. –

+0

@Mike, oui ils sont. Ils sont spécifiés dans IEEE Std. 1003.1 POSIX, la spécification de base OpenGroup/spécification UNIX simple, ainsi que la norme ISO C99. Windows n'est tout simplement pas conforme aux trois normes (c'est pourquoi j'ai suggéré d'utiliser , qui résout ce problème). –