Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 10/12/2006, à 17:54

dialloma

[Résolu]mais comment utiliser les classes abstraites en c++

Bonjour à tous,

j'ai un problème serieux  sur les classe abstraites en c++. J'ai une classe Abstraite dont heritent deux autres classes qui elles, ne sont pas abstraites. J'ai codé quelques fonctions, la compilation passe bien. Mais quand je declare une variable (instance) d'une des classes filles, le compilateur me jette en me disant que je n'ai pas le droit, enfin je crois qu'il consisère que ces classes filles qui ne contiennent aucunes fonctions virtuelles sont abstraites. Je ne suis pas bien en c++ mais je crois qu'une classe ne peut être abstraite que si elle a au moins une fonction virtuelle pure. Je vous poste mon code et le makefile pour que vous vous m'aidiez à corriger des eventuelles bugs. Merci d'avance.

1. le .cpp

#include <iostream>

#include "Matrice.hpp"

using namespace std;

int main(void){


	cout<<"TP3 C++ Matrices Carrés et Héritages"<<endl;

/*	
	MatriceTriangulaireInf mti;
	Matrice* mat = &mti;
	mat->f();
	
	cout<<"Saisissez les coefficients de la matrice (MTI):"<<endl;
	cin>>mti;

	cout<<"Affichage de la matrice Triangulaire Inférieure:"<<endl;
	cout<<" "<<mti;*/

	return EXIT_SUCCESS;
}

2. le .hpp

const unsigned int defaultsize = 3; //defaultsize

class Matrice{

	//methodes virtuelle taille() et operateur parentheses()
	//pas d'implémentation dans cette classe
	public:
		virtual unsigned int taille() const = 0;
		virtual float operator() (int i, int j) = 0;
		virtual ~Matrice() = 0;


};

class MatriceCarrePleine: public Matrice{

	//Taille de la matrice courante
	public:
		unsigned int taille() const{

			return _dim;
		}

		//operateur parenthese
		float operator()(int i, int j) const{

			return matCarPleine[i][j];
		}


		//Constructeurs et destructeurs

		MatriceCarrePleine(int d=defaultsize){

			//*matCarPleiM(i,j)ne = new float[_dim=d];
			matCarPleine[_dim=d][_dim=d];
		}

		~MatriceCarrePleine(){

			delete []this->matCarPleine;
		}



		friend std::ostream& operator<<(std::ostream& os, const
MatriceCarrePleine& M);

	//Opérateur d'entrée par flots
		friend std::istream& operator>>(std::istream& is, MatriceCarrePleine& M);

		//Variables membres private
	private:
		unsigned int _dim;
		float matCarPleine[defaultsize][defaultsize];
		//float * matCarPleine[defaultsize];

};

class MatriceTriangulaireInf: public Matrice{

	public:
	//Taille de la matrice
		unsigned int taille() const{

			return _dim;// = defaultsize;
		}

		//Operator parentheses
		float operator()(int i, int j=1) const{

			//return matTriInf[1][i];
			return matTriInf[i];
		}

	//Constructeurs et destructeurs

		MatriceTriangulaireInf(int d = defaultsize){

			//matTriInf[1][_dim=d];
			matTriInf = new float[_dim=d];

		}

		~MatriceTriangulaireInf(){

			//delete []matTriInf;
			delete matTriInf;

		}

		//Operator d'entré sorties

	//Opérateur de sortie par flots
	friend std::ostream& operator<<(std::ostream& os, const MatriceTriangulaireInf& M);

	friend std::istream& operator>>(std::istream& is, MatriceTriangulaireInf& M);

	private:
		unsigned int _dim;
		//float matTriInf[1][defaultsize];
		float* matTriInf;



};

#include "Matrice.inl"

3. le .inl

#include <iostream>

using namespace std;

inline std::ostream& operator<<(std::ostream& os, const
MatriceCarrePleine& M){

	const unsigned int n = M.taille();

	for(unsigned int i=0; i<n; ++i){
		for(unsigned int j=0; j<n; ++j){
			
			os<<(M(i,j));
		}
		//os<<"\n";	
	}
	
	return os;
}

// 	Opérateur d'entrée par flots
inline std::istream& operator>>(std::istream& is, MatriceCarrePleine& M){

	const unsigned int n = M.taille();
	float m;
	for(unsigned int i=0; i<n; ++i){
		for(unsigned int j=0; j<n; ++j){
			m = M(i,j);
			is>>(m);
		}

	}

	return is;
}
		
		
		
		
//Opérateur de sortie par flots
inline std::ostream& operator<<(std::ostream& os, const MatriceTriangulaireInf& M){
	
	const unsigned int n = M.taille();
	
	for(unsigned int i=0; i<n; ++i){
		
		os<<(M(i));
		
	}
	os<<"\n";
	
	return os;
}
//	Opérateur d'entrée par flots    
inline std::istream& operator>>(std::istream& is, MatriceTriangulaireInf& M){

	const unsigned int n = M.taille();

	float m;

	for(unsigned int i=0; i<n; ++i){

		m = M(i); 
		is>>(m);

		//ici c'est flou for me. pourquoi on ne peut pa directement faire
		//is >> M(i);
		
	}

	return is;
}

4. Le makefile

CPP = g++             # Nom du compilateur
CFLAGS = -Wall -O3   # options de compilation

all : Matrice

Matrice : Matrice.o 
	$(CPP) -o $@ $^

%.o : %.cpp
	$(CPP) $(CFLAGS) -o $@ -c $<

clean :
	rm -f main *.o

Merci d'avance

Dernière modification par dialloma (Le 11/12/2006, à 02:19)

Hors ligne

#2 Le 10/12/2006, à 22:03

murlock

Re : [Résolu]mais comment utiliser les classes abstraites en c++

Bon, malgré le fait que tu n'ais pas répondu à mon poste sur ta précédente question, je te donne un indice, as-tu lu attentivement (et non à tante yvement) le message d'erreur ? (que tu oublies de poster car, encore un fois, tu postes ton TP en entier plutôt qu'un exemple minimun qui te pose problème)

Si tu as lu (et relu) ton message d'erreur, tu devrais t'apercevoir que ta méthode operator() est différente dans la classe de base et de ces dérivés.

PS:
il existe des forums plus spécialisé qu'ici pour répondre à tes questions C++, comme www.developpez.com ou encore le newsgroup fr.comp.lang.c++


Gloire à mon Saigneur Arioch

Hors ligne

#3 Le 11/12/2006, à 02:13

dialloma

Re : [Résolu]mais comment utiliser les classes abstraites en c++

oh je suis désolé murlock, je n'ai pas vraiment d'excuses. Ton dernier poste m'avais bien aidé car je confondais des choses encore. Mais à travers ton exemple qui était assez simple et facile à comprendre, j'ai pu avancer, je n'ai pas passé beaucoup de temps dessus mais j'ai pu m'inspirer de ton exemple pour me depanner. Encore une foix merci merci et merci. Par contre, si je devais me justifier, j'avais un problème de connection, j'ai voulu optimiser mon ex-xbuntu, je ne sais qu'est ce que j'avais desinstallé, le système s'est bloqué donc il m'a fallut reinstaller tout et configurer tout. ça m'a pris pas mal de temps quand même. Mais je devais tout de même te remercier parce que ce tu fais , ce que les autres aussi font d'ailleurs c'est très gentile, donc vous devez au moins un merci. Encore merci pour la piste developpez.com, je vais y aller là et je te tiendrai courant. merci et bonne nuit

Hors ligne