OVH Cloud OVH Cloud

question simple sur encapsulation

3 réponses
Avatar
bv
Bonjour,

J'ai un certain nombre de classes imbriquées dans un modèle mathématique.
Tout marche mais tout est public.
Je voudrais maintenant encapsuler ça correctement.

C'est sans doute très simple. Supposons une classe comme suit:

class Class1
{
private:
Class2 * class2obj;
}

Quelle est la façon la plus appropriée, la plus efficace, d'écrire
l'interface d'accès à class2obj ?

Est ce qu'ajouter par exemple comme membre public:
Class2 * GetClass2Arr() {return class2obj;};
et/ou
Class2 GetClass2Elt(int inx) const {return class2obj[inx];};

semble une solution possible? (je ne pense pas...)


D'avance merci
bv

3 réponses

Avatar
Guillaume Gourdin
class Class1
{
private:
Class2 * class2obj;
}

Quelle est la façon la plus appropriée, la plus efficace, d'écrire
l'interface d'accès à class2obj ?


Si ton pointeur est un tableau, je pense que le mieux est d'écrire :

const Class2 & GetData(int nIndex) const {return ( class2obj[nIndex] ); }

Ce qui te garanti que l'objet renvoyé ne pourra pas être modifié. Par
ailleurs, essaye d'utiliser les std::vector.

Avatar
Keon
bv wrote:
Bonjour,

J'ai un certain nombre de classes imbriquées dans un modèle
mathématique. Tout marche mais tout est public.
Je voudrais maintenant encapsuler ça correctement.

C'est sans doute très simple. Supposons une classe comme suit:

class Class1
{
private:
Class2 * class2obj;
}

Quelle est la façon la plus appropriée, la plus efficace, d'écrire
l'interface d'accès à class2obj ?

Est ce qu'ajouter par exemple comme membre public:
Class2 * GetClass2Arr() {return class2obj;};
et/ou
Class2 GetClass2Elt(int inx) const {return class2obj[inx];};

semble une solution possible? (je ne pense pas...)


D'avance merci
bv


Tu dois écrire une fonction membre publique dans la classe un qui prenne
aussi les argument

class Class2
{
private :

int * obj = new int;

public :

void fct (int a)
{
obj = a;
}

};

class Class1
{
private :

Class2 class2obj;

public :

void fctClass1();
};

void fctClass1(int n) : void fct(n)
{

}


main()
{
int N;
N=5;
Class1 test1;
test1.fctClass1(N);
}

Avatar
Fabien LE LEZ
On Thu, 23 Oct 2003 00:53:05 -0400, "bv"
wrote:

class Class1
{
private:
Class2 * class2obj;
}

Quelle est la façon la plus appropriée, la plus efficace, d'écrire
l'interface d'accès à class2obj ?


Pour faire vite :

class Class1
{
public:
Class2& operator [] (int numero);
Class2 const & operator [] (int numero) const;
...


Maintenant, le problème c'est que tu as un pointeur, donc j'imagine
que tu alloues de la mémoire dans le constructeur et tu la libères
dans le destructeur.
Si, pour une raison ou pour une autre, tu ne peux pas utiliser un
conteneur (std::vector<> par exemple), je te conseille fortement de
laisser comme seule responsabilité à la classe Class1 de gérer
l'allocation et la désallocation. Elle sera sans doute contenue dans
une autre classe, accessible par l'utilisateur, et à l'interface plus
riche.

--
;-)