2010-09-13 5 views
1
class a 
{ 
protected: 
    const int _ID; 

public: 
    a::a(int id){}; 
    a::top(int num); 
}; 

class b : public a 
{ 
    static int ok; 
    b::b(int id):a(id){}; 
    a::top(ok); 
} 

int main() 
{ 
    int t=5; 
    b opj=b(t); 
} 

d'abord pourquoi je reçois cette erreur de compilation qui a résolu que lorsque je retire la constmembres statiques et consts

non statique membre const « const int Student :: _ ID », ne peut pas utiliser l'opérateur d'affectation par défaut - instancié du 'vide std :: vector :: _ M_insert_aux (__ gnu_cxx :: __ normal_iterator, const _TP &) [avec _TP = Student, _Alloc = std :: allocateur]'

secondes

j'ai anthères problème

référence non définie à b :: ok

+3

S'il vous plaît avoir la décence et formater votre code source d'une manière bien lisible. Cela vaut également pour le texte de la question elle-même. –

+1

@ Jim Brissom: Cut Mati un peu mou - ressemble à il/elle est un nouvel utilisateur. Mieux encore, aidez le formatage pour qu'il/elle puisse le voir. @mati: voici la référence de formatage: [http://stackoverflow.com/editing-help –

+0

@Otaku non, il ne se soucie pas d'une vraie réponse ou il se moque simplement des utilisateurs SO ou les deux. Regardez juste ses autres questions. Je ne vais pas perdre mon temps à enseigner à un troll comment appuyer sur un bouton «formater-le». –

Répondre

5

Deuxième première: b::ok a été déclaré , mais pas défini. Someplace, (de préférence b.cpp), vous devez ajouter:

int b::ok; 

En ce qui concerne votre premier problème, _ID est const, sa valeur ne peut pas être changé - mais, vous ne donnez jamais une valeur pour commencer avec. Vous devez attribuer une valeur initiale:

protected: 
     const int _ID = 1234; 

Maintenant, vous devriez _ID vraiment défini et, comme nous l'avons fait avec b :: ok, mais comme il est const, le compilateur peut vous laisser partir sans faire cela (certaines conditions s'appliquent).

4

Ce code a aussi des raisons de signaler des erreurs de compilation.

  • En C++, vous n'êtes pas autorisé à utiliser des noms qualifiés lors de la déclaration des méthodes de classe, de sorte que votre a::a et a::top dans la définition de la classe a sont carrément illégaux.
  • Les déclarations de méthodes sans type de retour ne sont pas claires non plus.
  • Une déclaration de a::top en b n'a aucun sens non plus. Que fait-il là? Et quelle était l'intention d'avoir a::top(ok) au milieu de la définition de la classe?

En d'autres termes, vous code n'a aucun sens que ce soit. Ce n'est même pas un code C++ à distance. Si vous introduisez ceci dans un compilateur C++, les résultats seront à peu près aussi significatifs que si vous aviez nourri le "Hamlet" de Shakespeare dans un compilateur C++. Il n'est pas possible de dire quel est le problème avec le code, quand tout est faux. S'il s'agit d'une autre langue, veuillez la marquer en conséquence au lieu de [C++].

2

Puisque _ID est const, il doit être initialisé dans la liste d'initialisation constructor/base member. Un peu comme ceci:

a::a(int id) : _ID(5) {}; 

Cependant, j'ai eu une tonne d'erreurs quand j'ai essayé de construire cela. Êtes-vous sûr que vous avez collé le tout?

0

Pour répondre d'abord à votre deuxième question: ok est un membre statique et doit être initialisé en tant que tel.Incluez une ligne similaire à:

int b::ok = 0; 

... dans le fichier d'implémentation de votre classe b. Comme pour le membre _ID: Vous avez déclaré _ID comme une constante, mais vous ne l'avez pas définie, c'est-à-dire que vous n'avez pas fourni de valeur pour la constante. Comme il est constant et que vous n'êtes pas autorisé à le changer plus tard, comment vous attendez-vous à ce que _ID prenne alors une valeur?

De plus, il y a d'autres choses «amusantes» qui se passent dans votre code source et qui me conseillent de (re) lire un texte d'introduction.

Questions connexes