Forum Clubic

[c++] heritage et specialisation

j’ai une classe qui a cette tete la:

[cpp]
class A
{
public:
A(objet& o)
:_o(o)
{}
private:
Object& _o;
};
[/cpp]

je voudrais creer une classe derivée de A avec un contructeur sans parametre qui instancie un objet o dans le constructeur;

j’ai essayé ça
[cpp]
class B : public A
{
public:
B()
:_ob(),A(_ob)
{}
private:
Object _ob;
};
[/cpp]

mais ça ne marche pas o est instencié apres A :confused:
Est ce qu’il existe un moyen de faire ça?

Tu n’instancies rien ici.
Il n’y que des déclarations.

Ta classe B a son propre objet o. Est-ce bien nécessaire ?
Pourquoi ne pas déclarer l’objet o de A comme protected et ainsi permettre aux classes dérivées d’en hériter?
Il n’a pas le droit d’y accèder ?
Tu peux dans B faire un
Object myObject = new Object();
// puis appeler le constructeur de A avec myObject.

Est-ce que A dérive de Object ?
Comme tu construits un objet A à partir d’un objet Object.

je suis obligé d’instancié o dans une liste d’initialisation pouis qu’il n’est pas definie en temps que pointeur dans ma classe.

ma classe b n’a pas son propre objet o c’est le meme. dans la calsse A c’est une reference.

A ne derive pas de object c’est juste un champ de A.

En effet je me suis perdu.
Mais ce que je ne comprends pas c’est ce que tu fais de l’objet o de la liste d’initialisation de B.
Parceque l’on est d’accord B n’a aucun accès aux membre privés de A.
Et B ne possède pas de champs membre o.

ah oui pardon il fallait lire

[cpp]
class A
{
public:
A(Objet& o)
:_o(o)
{}
private:
Object& _o;
};
[/cpp]

[cpp]
class B : public A
{
public:
B()
:_ob(),A(_ob)
{}
private:
Object _ob;
};
[/cpp]

pour la classe B mon idée c’etait de creer un objet pour la passer en parametre au contructeur de A mais le probleme c’est que le constructeur de A est appelé en premier quelque soit l’ordre dans la liste d’initialisation :confused:

Avec la liste d’initialisation c’est impossible.
L’ordre est celui des déclarations de la classe.
http://www.synspace.com/FR/Services/rules.html

Mais le constructeur de la classe parent est prioritaire.

Pour la solution par contre je suis paumé. Désolé.
Je ne connais pas d’exmple de ce genre.
As tu pênsé à revoir ta conception. Peut-être y a-t’il une autre méthode.

:stuck_out_tongue:

ok merci pour l’info je pensais que c’etait l’ordre dans la liste qui comptait

c’est bizarre je fait ça dans toute mes classes et j’a juste des warning (pas de probleme a l’execution)

va falloir que je regarde ça attentivement et que je me calme a faire des listes d’init partout :).
bon bah j’ai l’impression que ce que je veux faire est pas possible.
Tant pis je vais devoir me trimballer des constructeur a trouze mille arguments :confused:

merci de ton aide :slight_smile:

[cpp]

A(objet& o)
:_o(o)
{}

[/cpp]

mon c++ est un peu rouillé ça veut dire quoi ‘_o’ ?

merci

_o c’est juste le nom d’une variable
le _ sert juste a eviter de se tromper entre l’argument et la variable membre

C’est le nom de du champs membre que tu veux initialiser.
Ce qu’il y a entre parenthèse, c’est la valeur que tu veux attribuer au champs.

Grilled :slight_smile:

Je suis rouillé aussi. Je tourne au C# en fait. Et j’essaye de faire du code safe.

je vois pas comment peut marcher cette syntaxe en fait

_o c un membre de A… ??? !!! ???

ça êut marcher mais c vraiment moche… :wink:

generalement cette notation s’utilise comme ça…

[cpp]

class A
{
public:
A(int i)
{

}
};

class B : public A
{
public:
B(int i):A(i)
{

}
};

[/cpp]

en fait tu veux initialiser un objet o juste avant d’instancier A qui sert de base à B
A contenant un reference à o ? c ça ?

je te conseilles fortement :

  • instancier o puis passer une ref de o au constructeur de B (incidemment B)

[cpp]

class myObject;

class A
{
public:
A(myObject& o)
{
m_o=o;

}
myObject& m_o;
};

class B : public A
{
public:
B(myObject& o):A(o)
{

}
};

myObject o(…);

A instanceDeA(o);

B instanceDeB(o);

[/cpp]

attention instanceDeA.o et instanceDeB.o font reference au meme objet !!!

soit d’utiliser les constructeurs de copie (par defaut ou non) de la classe myObject

[cpp]

class myObject;

class A
{
public:
A(myObject o)
{
m_o=o;

}
myObject m_o;
};

class B : public A
{
public:
B(myObject o):A(o)
{

}
};

myObject o(…);

A instanceDeA(o);

B instanceDeB(o);

[/cpp]

instanceDeA.o et instanceDeB.o sont deux instances distinctes de myObject …

On est d’accord.
Mais il ne veut pas utiliser de paramètre dans le constructeur de B.
Alors du coup je vois pas comment il s’en tire.
Je pense qu’il y a un problème de conception.
B est une spécialisation de A, mais A contient une référence à un objet de B. Pourquoi la classe parent ne contiendrait pas l’objet et la classe fille un accès ?
Maintenant comme je ne sais pas à quoi servent les classes. c’est peut-être totalement hors sujet.

non alors il peut faire ça :

[cpp]
class myObject;

class A
{
public:
A(myObject o)
{
m_o=o;
...
}
myObject m_o;
};

class B : public A
{
public:
B(...):A(myObject(...))
{
...
}
};

B instanceDeB(...);

[/cpp]

l instance B contient un objet o instancié et copié

C’est bien evidement la premiere chose que j’ai testé mais le compilo a beuglé a cause du fait que o est une reference.

ok je comprend mieux

obligatoir passage pas reference : copie ?

sinon

[cpp]
class myObject;

class A
{
public:
A() // constructeur par defaut
{
...
}
void setO(myObject& o) { m_o=o; }
myObject& m_o;
};

class B : public A
{
public:
B(...):A()
{
...
A::setO(m_ob);
}
myObject m_ob;
};

B instanceDeB(...);

[/cpp]

oki ?

en fait comme o est defini en temps que reference dans la classe A on est obligé de l’initialisé dans la liste.

Je crois pas que mon probleme est de solution. Je vais garder ce parametre pour B et déspecialiser B.

ça te va pas la solution avec un constructeur par defaut et une initialisation a posteriori ??? a moins que o soit vital pour la l’initialisation de l objet A…

mais si ça peut attendre quelques lignes

tu instancie B qui a un membre m_ob de la class myObject

et ensuite tu passe cet object a A pour qu’il le colle en reference…

On est obligé d’initialiser une reference des sa declaration. Ma classe A est mal foutue en fait. La seule solution serait donc de passer par des pointeurs et de tout modifier, mais ya toute une librairie derriere alors je vais devoir la laisser comme ça.

effectivement :confused: coincé