2013-09-22 2 views
0

Je ne suis pas très bon avec C++ et je me demandais pourquoi une erreur se produisait avec les tableaux à l'intérieur des tableaux, mais fonctionne bien avec un tableau normal (et comment le réparer).Essayer de stocker un tableau complexe dans une classe C++

Heres le code (juste essayer de stocker un tableau dans une classe à la construire):

class foo { 
    int* stored; 
public: 
    foo(int* ptr) { 
     stored = ptr; 
    } 
}; 

int main() { 
    int arr[][2] = {{1,4},{5,7},{2,5}}; 
    foo obj(arr); 
} 

Lorsque le tableau est quelque chose comme int arr[] = {1,2,3} cela fonctionne sans erreur, mais le code normal me donne cette erreur:

error: no matching function for call to 'foo::foo(int [3][2])' 

J'ai cherché pendant un moment, mais je ne sais pas vraiment quoi chercher en premier lieu, ce qui est la raison pour laquelle je demande ici (mais je pense qu'il a quelque chose à voir avec des pointeurs). Merci pour toute aide.

+0

@texasbruce Un tableau de tableaux n'est pas ** identique à un pointeur sur un pointeur. Voir par exemple [Cette réponse à moi pour voir pourquoi] (http://stackoverflow.com/a/18440456/440558). –

Répondre

1

Vous essayez de transmettre un tableau de tableaux d'entiers sous la forme d'un pointeur unique, ce qui ne fonctionnera pas. Bien qu'il soit vrai qu'un tableau se décompose en pointeur lorsqu'il est passé, un tableau de tableaux ne peut pas être un seul pointeur, ni un pointeur vers un pointeur non plus.

Il peut cependant être utilisé comme un pointeur sur un tableau:

class foo 
{ 
    int (*stored)[2]; 

public: 
    foo(int (*ptr)[2]) : stored(ptr) {} 
}; 

Les parenthèses dans la déclaration est nécessaire parce que sinon ce serait un tableau de pointeurs.

Cependant, je recommande contre l'utilisation des tableaux crus, et de passer à std::vector ou std::array, ce qui bien sûr peuvent être imbriquées:

std::vector<std::array<int, 2>> arr = { 
    {{ 1, 2 }}, 
    {{ 3, 4 }} 
}; 
+0

Merci, je vais regarder plus dans les vecteurs et les tableaux de la chose standard, je n'ai jamais vraiment rien su d'eux. – lemondrop

+0

@lemondrop J'ai mis à jour ma réponse avec des liens vers des pages de référence pour les conteneurs standards. –

+0

@lemondrop: Il y a aussi 'std :: complex'. –

1

Tout d'abord votre code (même si elle a travaillé) ne serait pas stocker un tableau. Dans votre classe, vous avez un pointeur donc tout ce que vous stockez est un pointeur vers un tableau. Il est important d'avoir ces distinctions claires dans votre tête.

Vous devez déclarer un pointeur compatible avec le tableau que vous essayez de 'stocker'. Ce pointeur est int (*stored)[2], c'est-à-dire un pointeur vers un tableau de deux ints.

Sa fait assez simple

int* is compatible with int[] 
int (*)[N] is compatible with int[][N] 
int (*)[N][M] is compatible with int[][N][M] 

etc., etc. Mais les parenthèses font confondre les gens. Ils sont nécessaires car l'opérateur * a une priorité inférieure à l'opérateur [].

Questions connexes