2016-02-12 1 views
-4

J'ai une classe dérivée d'une classe abstraite, et j'essaie de la passer en argument d'une classe membre de la classe dérivée. J'ai aussi un problème de déclaration à terme. Aucune suggestion?Transmettre la classe de base en tant qu'argument dans une fonction membre de la dérivée

class base; 
void print(*base); 


class base { 
public: 
const int number = 5; 
// ... virtual funcs etc. 
};  

class derived:public base { 
public: 
void test() { 
print(&base); // I guess here is the mistake 
}; 

void print(*base) { 
cout << base->number << endl; 
} 
+0

Voter pour fermer la question - ce n'est vraiment utile à personne, le code est presque aléatoire. – SergeyA

Répondre

1

Il suffit de ne print(this) (voir online example). Vous ne pouvez pas prendre l'adresse d'une classe.

+0

Le 'ceci' renvoie un pointeur vers la classe dérivée, pas la base que je veux. erreur: Conversion non valide définie par l'utilisateur de 'derived *' à 'base &' – user4168715

+0

Je suppose que 'print' est déclaré dans votre code réel comme' void print (base &) '. Dans ce cas, utilisez 'print (* this); – TartanLlama

0

Une classe est un type. Les types n'ont pas d'adresse, seules les variables le font. Vous semblez également manquer même la compréhension de base de C++.

void print(*base); 

Est un non-sens absolu. Vous devez revenir aux livres.

0

Pointeurs à un des objets de classe peuvent convertir implicitement à des pointeurs vers leur classe de base, vous pouvez juste passer this et laisser la conversion standard se produire:

void test() { 
    print(this); 
}; 
0

I have a derived class from an abstract class, and I am trying to pass it as an argument of a member class of the derived one. I also have a forward declaration issue. Any suggestions?

Votre déclaration anticipée est erronée. C'est C++, pas aller, donc:

void print(base* pointerToBase); 

est correct. A part ça, la réponse d'Alf est juste. Je préfère utiliser une référence qu'un pointeur, et comme l'impression ne modifie généralement pas l'état, faites-le const. Votre code devient alors:

class base { 
public: 
const int number = 5; 
// ... virtual funcs etc. 
};  

void print(const base&); 

class derived:public base { 
public: 
void test() { 
print(*this); 
}; 

void print(const base& b) { 
cout << base.number << endl; 
}