2009-05-08 9 views
2
#include <iostream> 
using namespace std; 

// This first class contains a vector and a scalar representing the size of the vector. 
typedef class Structure1 
{ 
int N; 
double* vec; 
public: 
// Constructor and copy constructor: 
Structure1(int Nin); 
Structure1(const Structure1& structurein); 
// Accessor functions: 
int get_N() { return N; } 
double* get_vec() { return vec; } 
// Destructor: 
~Structure1() { delete []vec; } 
} Structure1; 

Structure1::Structure1(int Nin) 
{ 
N = Nin; 
vec = new double [N]; 
for (int i = 0; i < N; i++) 
    { 
    vec[i] = i; 
    }; 
} 

Structure1::Structure1(const Structure1& structurein) 
{ 
vec = new double[structurein.N]; 
for(int i = 0; i < structurein.N; i++) 
{ 
    vec[i] = structurein.vec[i]; 
}; 
} 

// This class just contains the first structure. 
typedef class Structure2 
{ 
    Structure1 structure; 
public: 
    // Constructor: 
    Structure2(const Structure1& structurein) { structure = structurein; } 

L'erreur se produit ici:problème constructeur de C

ligne Localisation main.cpp: 47: Erreur: pas de fonction concordante pour appel à 'Structure1 :: Structure1()'

// Accessor Function: 
    Structure1 get_structure() { return structure; } 
    // Destructor: 
    ~Structure2() {} 
} Structure2; 

int main (int argc, char * const argv[]) 
{ 
const int N = 100; 
Structure1 structure1(N); 
Structure2 structure2(structure1); 

return 0; 
} 

Si Quelqu'un sait ce qui ne va pas, votre aide serait grandement appréciée. Merci!

Répondre

1

d'ailleurs, je pense que vous devez corriger le constructeur de copie:

Structure1::Structure1(const Structure1& structurein) 
{ 
///!!!! Initialize N 
N = structurein.N; 

vec = new double[structurein.N]; 
for(int i = 0; i < structurein.N; i++) 
{ 
    vec[i] = structurein.vec[i]; 
}; 
} 
+0

Au début, vous devez vous assurer que vous construisez l'objet à partir d'un autre objet, comme si (this == & structurein) retourne; Sinon, votre copie ne fonctionnera pas, et aussi une fuite de mémoire, nous serons là aussi. – ypsu

+0

Ah, désolé, ignorez mon commentaire précédent, j'ai mixé ceci avec l'opérateur =! :) – ypsu

+0

Désolé pour le spam, mais vous pouvez toujours construire l'objet à partir du même objet: new (& b) A (b); L'appel d'un emplacement nouveau avec la même adresse où l'objet à partir duquel A est construit est rare, peut-être pouvez-vous l'ignorer. – ypsu

7

Vous devez utiliser un initialiseur de membre dans votre structure2 ctor.

Structure2(const Structure1& structurein) : structure(structurein) {} 

Il essaie d'utiliser un constructeur par défaut pour votre membre Structure1, et il n'en existe aucun.

0

Puisque vous avez déclaré un constructeur pour Structure2, le compilateur refuse de créer un constructeur par défaut pour ce qui est nécessaire pour accéder aux membres de la classe comme vous le faites dans ce constructeur:

Structure2(const Structure1& structurein) { structure = structurein; } 

Vous devriez probablement pas:

Structure2(const Structure1& structurein) : structure(structurein) {} 
Questions connexes