2011-09-29 3 views
0

Supposons que vous ayez une classe avec un pointeur privé vers un tableau. Comment pouvez-vous utiliser un getter pour accéder (ou copier efficacement les données) afin que vous puissiez y accéder dans une variable différente.Renvoyer un pointeur sur un tableau

class MyClass 
{ 
    private: 
     double *x; 
    public: 
     myClass(); 
     virtual ~MyClass(); 
     double* getX() const; 
     void setX(double* input); 
}; 

MyClass::MyClass() 
{ 
    double foo[2]; 
    double * xInput; 
    foo[0] = 1; 
    foo[1] = 2; 

    xInput = foo; 
    setX(xInput); 
} 

void MyClass::setX(double * input) 
{ 
    x = input; 
} 

double * MyClass::getX() const; 
{ 
    return x; 
} 

int main() 
{ 
    MyClass spam(); // Construct object 
    double * bar = spam.getX(); // This doesn't work 
} 

Dans ce cas, bar [0] et bar [1] sont égales à jibberish: -9.2559631349317831e+061.

+0

Je suis surpris que je ne pouvais pas trouver une question similaire sur SE, mais si quelqu'un me prouve mal, fermer la réponse ahoy! – Elpezmuerto

+2

Il serait utile que vous nous disiez l'erreur que vous obtenez. –

+0

C'est sympa de fournir la sortie exacte du compilateur au lieu de "ça ne marche pas". – unwind

Répondre

3

Juste une supposition, le programme plante ou montre la mauvaise sortie. Cela est dû au fait que le constructeur place un pointeur sur un tableau local, ce qui laisse une portée et est détruit à la fin du constructeur.

+0

Alors, comment puis-je résoudre ce problème dans le constructeur? – Elpezmuerto

+0

@Elpezmuerto: MyClass aura besoin d'un membre 'double foo [2]', ou vous devrez utiliser de la mémoire dynamique. (Pour la mémoire dynamique, lisez plus loin dans votre livre C++) –

+0

@Elpezmuerto, vous devez initialiser le pointeur avec un tableau qui ne disparaîtra pas. Il peut s'agir d'un membre de la classe, d'une variable statique, d'un paramètre passé au constructeur ou de quelque chose attribué avec 'new'. Si vous l'allouez, vous devez le supprimer à un moment donné, ce qui nécessiterait de savoir si vous possédez le pointeur ou s'il a été fourni via setX. –

7
MyClass spam(); // Construct object 

Cela ne construit pas un objet, qui déclare une fonction appelée spam qui ne prend aucun argument et renvoie une MyClass. Ce défaut construit un objet:

MyClass spam; // Construct object 

Pour plus d'informations Google l'analyse syntaxique le plus contrariant.

Mise à jour: Comme l'a souligné @ Mark Ransom, il existe un autre problème avec votre code. Dans votre constructeur, vous créez un tableau, puis définissez x pour pointer vers ce tableau. Cependant, la durée de vie du tableau se termine une fois que le constructeur a terminé l'exécution, de sorte que l'accès à x échouerait (si vous êtes assez chanceux).

+1

Ce que ce gars a dit! :) – MGZero

+1

+1 pour un élément d'information intéressant! –

+2

Et la raison pour laquelle il est si vexant est qu'il est difficile à repérer - je l'ai certainement manqué. +1 –

0

Cela devrait probablement être * barre au lieu de barre [0].

+3

En C et C++, ils sont équivalents. –

+0

Oui, vous avez raison, bien sûr :-) – Dabbler

Questions connexes