2017-04-26 3 views
0

J'ai besoin d'aide avec une déclaration en classe d'un pointeur. Je cherche un moyen d'utiliser un tableau de style c (donc malheureusement pas de vecteurs) bien que j'utilise C++. Je n'arrive pas à ne pas avoir d'erreurs dans l'exécution telles que "erreur de segmentation: 11" ou "erreur de bus: 10". Le but est d'avoir un moyen de contenir 10 références à des personnes dans une classe.Déclaration d'un tableau privé accédé par un pointeur dans une allocation de classe et de mémoire

Ces pointeurs sont déclarés dans le fichier .h de cette façon:

private: 
string * name; 
string * surname; 
int * index1; 
int * index2; 

et dans le cteur dans le fichier .cc Je l'ai utilisé différentes façons d'allouer de la mémoire, tels que:

string * name = new string[10]; 
string * surname = new string[10]; 
int * index1 = new int[10]; 
int * index2 = new int[10]; 

mais j'ai des erreurs d'exécution, peut-être parce qu'il n'accède en réalité pas aux variables privées ou qu'il excède la mémoire ("erreur de segmentation"). Si je n'écris pas les lignes ci-dessus, la sortie est "erreur de bus" pendant l'exécution. Je ne reçois pas d'erreurs dans la compilation, seulement pendant l'exécution. Je ne peux pas changer les types de variables privées dans le fichier .h et cela ne me permet pas d'utiliser new dans la classe car ce serait une extension de C++ 11.

Toute aide serait très apprécié

+1

Ce sont des variables locales et se cachent vos membres d'instance d'objet. Les types ('string *', etc ..) ne devraient pas être présents dans le c-tor (et sans doute vous devriez utiliser 'std :: vector <>' s en premier lieu). – WhozCraig

+0

Dans votre ctor la décalration devrait être comme 'name = new string [10]' et donc .. – sjsam

+0

Merci pour vos réponses rapides, mais j'ai aussi essayé de cette façon et il renvoie une erreur d'exécution – Lorenzo

Répondre

2

Je pense que vous devriez utiliser std :: vecteur, car il y a très peu de raisons pour les débutants à utiliser de nouveaux/supprimer.

Dans votre cas, la partie privée pourrait changer à:

private: 
std::vector<string> name; 
std::vector<string> surname; 
std::vector<int> index1; 
std::vector<int> index2; 

et dans le constructeur, pourrait avoir ceci:

name.resize(10); 
surname.resize(10); 
index1.resize(10); 
index2.resize(10); 
+0

Mieux encore, utiliser une liste d'initialisation de membre et avoir un corps de constructeur vide – NathanOliver

+0

OP effectivement explicitement dit "pas de vecteurs" –

+1

@PasserBy OP semble être un novice et il me semble mieux qu'ils aient une meilleure alternative que le nouveau/supprimer –