c ++ erreur d'erreur compilateur LNK2001: symbole externe non résolu

c ++ erreur d'erreur compilateur LNK2001: symbole externe non résolu

Cette erreur est vraiment source de confusion, le plus souvent invité à une fonction ou d' une variable non résolue.
Si elle est variable, les variables membres généralement statiques static typename xxxsans initialisation utiliseront (si les données ne sont pas membres de la classe vs se plaindra).
La raison en est que si nous déclarons simplement une variable statique sans initialisation , le compilateur est pas une variable statique pour l'allocation de l' espace , que lorsque l' initialisation des variables statiques après le compilateur donnera cette variable est affectée une zone statique de l' espace mémoire , de sorte que le programme pour trouver cette variable dans la zone de données et continuer à utiliser.
Si elle est une fonction, la situation que j'ai rencontré à l' heure actuelle sont les suivants :
1) ne mentionnaient la fonction, mais n'a pas terminé la définition;
2) se sont réunis aujourd'hui, appelez la classe dérivée, la classe de base sans fonctions virtuelles compléter la définition de la vie.

//Declaration.h
class myExc 
	{
	protected:
		double a;
		double b;
	public:
		myExc() :logic_error(""){}
		virtual void show();
	};
	
	class bad_gmean :myExc
	{
	public:
		bad_gmean(){}
		void show(){ cout << "gmean( " << a << " , " << b << " ): invalid arguments: a < 0 or b < 0\n"; }
	};

	class bad_hmean :myExc
	{
	public:
		bad_hmean(){}
		void show(){ cout << "hmean( " << a << " , " << b << " ): invalid arguments: a = -b\n"; }
	};

Le chiffre peut être vu qu'une classe dérivée remplace la classe de base void show()fonction, mais la classe de base void show()n'est pas définie en ligne.

//main.cpp
/*
...
*/
catch (myExc &b)
		{
			b.show();
			cout << "Exception type: " << typeid(b).name() << endl;
			cout << "Try again.\n";
			continue;
		}
/*
...
*/
		

Le chiffre peut être vu que la fonction principale, nous devons appeler la classe dérivée par référence à la classe de base show()fonction , mais pas utiliser directement la classe de base show(), cependant, la référence de classe de base dans la classe dérivée d'appeler une fonction de la façon dont appartient à la liaison dynamique , est terminée lorsque le programme est en cours d' exécution, et dans la phase de compilation du programme , le compilateur toujours pense qu'il appeler la classe de base show()fonction , et donc une erreur.
Les modifications est très simple, pour assurer qu'aucun appel aux méthodes de la classe de base prémisse , la fonction en ligne directe définit la classe de base show():

virtual void show() {}

Ou fonction virtuelle pure est une fonction, la classe de base correspondante sera transformé en une classe de base abstraite:

virtual void show() = 0

Pour utiliser la classe de base spectacle complet d'autres opérations, vous devez montrer une fonction correspondante dans la définition de la classe de base.

Publié 16 articles originaux · a gagné les éloges 10 · vues 4924

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44826484/article/details/104300070
conseillé
Classement