2010-01-24 6 views
1

Je cours un programme C++ qui utilise une classe d'un autre fichier .cpp. La classe a seulement un constructeur. Cela fonctionne quand je le teste séparément. Le programme principal compile, mais quand je l'exécute, j'ai un bogue dans le constructeur. Quelqu'un peut-il penser à une situation qui pourrait arriver? Merci.Problème compilation C++ classe

Je suppose que je viens de lancer le code dans le terminal, et il est très bien. Mais lorsque je tente de construire un projet dans Eclipse, il montre le code ci-dessous a de multiples erreurs de définition:

class model 
{ 
    public: 
    int textures []; 
    float vertices[][3]; 
    float triangles[][13]; 
    public: 
    model(const char*); // constructor 
}; 

model::model(const char* filename) 
{ 

message d'erreur est: définition multiple du modèle `:: modèle (char const *) »

tout idée?

+3

Montrez-nous un code qui produit le bug, s'il vous plaît. – AraK

+0

où est le code? – wilhelmtell

+0

Pas assez d'informations. – Drakosha

Répondre

2

Vous devez diviser votre code dans un .h (en-tête) et a.cpp (implémentation) fichier et mettre:

model::model(const char* filename) 
{ 

dans ce dernier. Ou, réécrire votre classe pour la définition du constructeur (et toutes les autres fonctions membres) est à l'intérieur de la classe dans le fichier d'en-tête:

class model { 
    ... 
    model(const char*) { 
    // constructor body here 
    } 
}; 
2

Quoi qu'il en soit, je vais une estimation aléatoire hasarde (compte tenu de ce que vous avez posté, il y a peu d'aller sur). Je suppose que vous avez débordé votre tableau de triangle (peut-être que le compteur est trop grand) et que vous êtes en train de jeter votre tas ou votre pile.

Encore une chose. Cette ligne:

if (str[0] != '#' and !str.empty()) 

est buggé. Si str est vide, vous ne voulez pas lire str [0]. Vous devez changer l'ordre autour de:

if (!str.empty() and str[0] != '#') 
+1

En fait, 'and' est le même que' &&'; l'essayer. En C, il fallait que vous incluiez 'iso646.h', mais en C++ ils sont implicitement disponibles. Ils sont appelés jetons alternatifs, et vous pouvez les trouver dans la section 2.5. Personnellement, je n'aime pas la pratique de les utiliser. – GManNickG

+0

@GMan - merci, je n'ai jamais connu ce coin de la langue avant. –

+0

Pas de problème, c'est un coin étrange en effet. – GManNickG

0

L'erreur se produit parce que vous obtenez une nouvelle définition de la fonction chaque fois que votre tête est inclus quelque part. Si elle est utilisée à plus d'un endroit dans le programme, vous obtenez l'erreur.

Vous voulez probablement définir le constructeur soit dans un fichier de mise en œuvre distincte (classe va-tête pour que les autres puissent l'utiliser, les implémentations de fonction vont .CPP/cc). Vous pouvez également le définir dans le bloc de classe au lieu de le faire à l'extérieur.