2017-04-23 1 views
1

Alors je crée une table de hachage-hachage fermé pour une classe et j'ai une structureC++ erreur de segmentation lors déréférencement d'un pointeur vers un vecteur de structures

struct Example { 
    string key; 
    string data; 

    Example() { key = "000"; } 
}; 

et une classe qui contient un membre qui pointe à un vecteur de structures, un constructeur, et une fonction que j'utiliserai pour illustrer le problème.

class hash_table { 
    private: 
    vector<Example>* hash; 

    public: 
    hash_table(int size); 
    void dummy_method(); 
}; 

Il est prévu d'allouer dynamiquement le nombre de structures dans le vecteur en fonction de l'entrée utilisateur/fichier.

hash_table :: hash_table (int size=10) 
{ 
    //initialize vector 
    vector<Example> * hash = new vector<Example>(size); 
    //test objects 
    for(int i=0;i<size;i++) 
    cout<<(*hash)[i].key<<endl; 
} 

le code ci-dessus apparaît pour initialiser les 10 membres, car il imprime « 000 » dix fois.

cependant, une fois que j'essaie en appelant dummy_method-

void hash_table::dummy_method() { 
    cout<<(*hash)[0].key<<endl; 
} 

Je reçois une erreur de segmentation

Je suis sûr que ce soit même pas la bonne façon de le faire, mais je J'ai regardé/bricoler pour toujours et je n'arrive pas à trouver une solution. Je dois absolument utiliser un pointeur vers un vecteur de structures, et je suis sûr que je suis censé allouer dynamiquement chacune de ces structures (d'une certaine façon). Merci pour toute aide.

(aussi, oui, nous avons fait d'utiliser l'espace de noms, donc pas std partout)

+3

Vous devez stocker un vecteur et non un pointeur sur un vecteur. Cela réduira la portée des bogues. – juanchopanza

+0

Qu'est-ce que 'htable' et comment est-il défini? Veuillez publier un exemple de code complet reproduisant le problème que vous posez. Sinon, il est difficile de donner des réponses utiles. – emlai

+0

désolé, htable est du plus grand programme. J'ai copié les fonctions du plus grand programme à un plus petit afin d'isoler le problème. Je l'ai édité pour refléter le bon code. Pour le moment, il s'agit d'un programme complet, donc tous les problèmes devraient être isolés. –

Répondre

2

expression vector<Example> * hash = new vector<Example>(size); initialise une variable locale avec le nom hash, pas membre hash_table::hash (qui reste non initialisée).

+0

Merci beaucoup d'avoir clarifié cela. Savez-vous s'il existe un moyen facile d'initialiser dynamiquement le membre hash_table :: hash et de le remplir avec des structures allouées dynamiquement? Désolé si c'est une question stupide, mon cerveau a un peu fondu d'essayer de comprendre tout cela. –

+0

Vous avez juste besoin de supprimer la partie 'vector *' ou même de la réécrire en tant que 'this-> hash' pour montrer explicitement que vous avez affaire à un membre de la classe. Les conflits de noms comme ceux-ci sont assez gênants en C++, vous pouvez utiliser une convention de nommage pour éviter cela, comme les variables membres commencent par 'm_', les variables régulières sont toujours écrites dans lower_case, les fonctions sont toujours écrites dans CamelCase 't_', les espaces de noms commencent par' n_'. – VTT

+0

Je savais que j'allais me sentir incroyablement stupide au moment où quelqu'un a répondu et je n'avais pas tort. J'apprécie vraiment l'aide. –