C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Problème d'accès aux fonctions d'une hiérarchie de classes

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Michael
Guest





PostPosted: Wed Aug 16, 2006 9:11 am    Post subject: Problème d'accès aux fonctions d'une hiérarchie de classes Reply with quote



Bonjour à tous,

je me trouve face à un souci que je n'arrive pas à résoudre:

class fooBase
{
public:
fooBase();

virtual void AddTo();
virtual void RemoveFrom();

virtual void Set();
};

class fooBase2 : public fooBase
{
public:
fooBase2();

virtual void AddTo();
virtual void RemoveFrom();
};

class fooImpl : public fooBase
{
public:
fooImpl();

void Special();
};

void Bind(fooBase & f)
{
f.Set();
}

class toto
{
private:
fooImpl * f;
public:
toto();

void SetfooImpl(fooImpl * f_)
{
f = f_;
f->AddTo();
}
};

Mon problème est que je veux rendre les fonctions fooBase::AddTo() et
fooBase::RemoveFrom() accessibles seulement depuis la classe toto et la
fonction Bind. Je ne veux pas que l'utilisateur de ces classes y ait accès.

Une solution serait de les déclarer private et d'ajouter friend class toto;
dans la déclaration de fooBase, mais du coup ça ne marche plus avec la
fonction Bind();

D'autre part, j'ai également ce genre de classes:

class fooImpl2 : public fooImpl
{
private:
fooBase2 * f1;
public:
fooImpl2();

virtual void SetF1(fooBase2 * f1_)
{
if (f1 != NULL)
f1->RemoveFrom();
f1 = f1_;
}
};

Ce qui du coup m'obligerait en plus à ajouter friend class fooImpl2; dans
fooBase...

Comme j'ai un certain nombre de classes dérivées de ce genre, c'est AMHA
une solution qui ne convient pas...

Est-ce qu'il existe une solution générique à ce genre de soucis?

Merci d'avance

Michael
Back to top
Pierre Barbier de Reuille
Guest





PostPosted: Wed Aug 16, 2006 9:11 am    Post subject: Re: Problème d'accès aux fonctions d'une hiérarchie de clas Reply with quote



Michael wrote:
Quote:
Bonjour à tous,

je me trouve face à un souci que je n'arrive pas à résoudre:

class fooBase
{
public:
fooBase();

virtual void AddTo();
virtual void RemoveFrom();

virtual void Set();
};

class fooBase2 : public fooBase
{
public:
fooBase2();

virtual void AddTo();
virtual void RemoveFrom();
};

class fooImpl : public fooBase
{
public:
fooImpl();

void Special();
};

void Bind(fooBase & f)
{
f.Set();
}

class toto
{
private:
fooImpl * f;
public:
toto();

void SetfooImpl(fooImpl * f_)
{
f = f_;
f->AddTo();
}
};

Mon problème est que je veux rendre les fonctions fooBase::AddTo() et
fooBase::RemoveFrom() accessibles seulement depuis la classe toto et la
fonction Bind. Je ne veux pas que l'utilisateur de ces classes y ait accès.

Souvent ce genre de problème vient d'un design pas adapté !
Par exemple, pourquoi la fonction Bind n'est pas une méthode de fooBase
? Si tu veux vraiment que ce soit une fonction, alors tu peux toujours
faire une méthode publique qui s'occupe de la fonctionnalité et la
fonction se contente d'appeler la méthode ...

Quote:

Une solution serait de les déclarer private et d'ajouter friend class toto;
dans la déclaration de fooBase, mais du coup ça ne marche plus avec la
fonction Bind();

D'autre part, j'ai également ce genre de classes:

class fooImpl2 : public fooImpl
{
private:
fooBase2 * f1;
public:
fooImpl2();

virtual void SetF1(fooBase2 * f1_)
{
if (f1 != NULL)
f1->RemoveFrom();
f1 = f1_;
}
};

Ce qui du coup m'obligerait en plus à ajouter friend class fooImpl2; dans
fooBase...

Comme j'ai un certain nombre de classes dérivées de ce genre, c'est AMHA
une solution qui ne convient pas...

Pour ton problème de classe dérivée, soit, comme suggéré plus haut, tu
peux imaginer une fonction de plus haut niveau dans fooBase qui soit
publique, soit tu peux définir une fonction protégée (protected) dans
fooImpl qui implémente ce que tu veux, et tu déclare simplement fooImpl
comme classe amie de fooBase.

Mais encore une fois, il est très rare qu'une déclaration de classe (ou
fonction) amie soit la bonne solution ... c'est souvent que tu as besoin
d'une méthode publique de plus haut niveau (par exemple, qui conserve
les invariants).

Pierre

Quote:

Est-ce qu'il existe une solution générique à ce genre de soucis?

Merci d'avance

Michael
Back to top
Michael
Guest





PostPosted: Mon Aug 21, 2006 7:25 pm    Post subject: Re: Problème d'accès aux fonctions d'une hiérarchie de clas Reply with quote



Quote:
Pour ton problŠme de classe d‚riv‚e, soit, comme sugg‚r‚ plus haut, tu
peux imaginer une fonction de plus haut niveau dans fooBase qui soit
publique, soit tu peux d‚finir une fonction prot‚g‚e (protected) dans
fooImpl qui impl‚mente ce que tu veux, et tu d‚clare simplement fooImpl
comme classe amie de fooBase.

Je ne vois pas vraiment ce que tu veux dire...

Si je définis une fonction de plus haut niveau dans fooBase (pour AddTo() par
exemple), elle sera toujours accessible à tout le monde; or, seule toto
devrait pouvoir y accéder...
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.