Comme je ne veux pas que toutes les méthodes de Array2 (resp Array3)
soient accessibles, j'utilise un heritage protege ; pour l'interface,
j'utilise un heritage public.
Comme je ne veux pas que toutes les méthodes de Array2 (resp Array3)
soient accessibles, j'utilise un heritage protege ; pour l'interface,
j'utilise un heritage public.
Comme je ne veux pas que toutes les méthodes de Array2 (resp Array3)
soient accessibles, j'utilise un heritage protege ; pour l'interface,
j'utilise un heritage public.
On Thu, 21 Sep 2006 15:27:24 +0200, vincent daanen :Comme je ne veux pas que toutes les méthodes de Array2 (resp Array3)
soient accessibles, j'utilise un heritage protege ; pour l'interface,
j'utilise un heritage public.
Es-tu bien sûr qu'un héritage soit la solution ?
Un objet membre de classe CArray2<VALUE> ne serait-il pas plus
adapté ?
non car l'objet CArray2<VALUE> dispose d'une mecanisme d'allocation de
On Thu, 21 Sep 2006 15:27:24 +0200, vincent daanen :
Comme je ne veux pas que toutes les méthodes de Array2 (resp Array3)
soient accessibles, j'utilise un heritage protege ; pour l'interface,
j'utilise un heritage public.
Es-tu bien sûr qu'un héritage soit la solution ?
Un objet membre de classe CArray2<VALUE> ne serait-il pas plus
adapté ?
non car l'objet CArray2<VALUE> dispose d'une mecanisme d'allocation de
On Thu, 21 Sep 2006 15:27:24 +0200, vincent daanen :Comme je ne veux pas que toutes les méthodes de Array2 (resp Array3)
soient accessibles, j'utilise un heritage protege ; pour l'interface,
j'utilise un heritage public.
Es-tu bien sûr qu'un héritage soit la solution ?
Un objet membre de classe CArray2<VALUE> ne serait-il pas plus
adapté ?
non car l'objet CArray2<VALUE> dispose d'une mecanisme d'allocation de
je suis confronte a un pb que je ne comprends pas :
J'ai une classe CImageNd qui definit une interface pour des
images n dimensionnelles (n = 2 ou 3, bcp de choses en
commun.) template <class VALUE, size_t DIM>
class CImageNd
{
.....
}
A partir de cette classe, je veux creer 2 types d'images : les
images 2D et les images3D.
Pour cela, j'utilise des types Array2 et Array3 dont je
dispose (libs externes, non modifiables) et mon interface.
template <class VALUE>
class CImage2D : public CImage <VALUE, 2>, protected CArray2<VALU E>
{
}
Comme je ne veux pas que toutes les méthodes de Array2 (resp
Array3) soient accessibles, j'utilise un heritage protege ;
pour l'interface, j'utilise un heritage public.
Comme ma classe d'interface connait bcp de choses, j'ai des
methodes qui portent le meme nom qu dans les classes
Array2(Array3) (par exemple : methode GetNbElements ou Sizeof)
Voici la facon dont je comprends ce qui se passe si je veux
utiliser la methode GetNbElements() sur une CImage3D
CImage3D vol(512,512,512);
vol.GetNbElements();
/*
GetNbElements est publique dans CImageNd et Array3 mais comme
CImage3D herite de facon publique de CImageNd et de facon protegee de
CImage3D ,
c'est CImageNd::GetNbElements() qui est 'appelee'
*/
or le compilo (MSVC++ 6.0, oui je sais mais j'ai pas le choix
:o( ) me dit :
CImage3D<float>::GetNbElements' is ambiguous
E:DevelVolumeInterpolation. avec
Image-nDtesttestVolumeInterpolation_3dFreehandMathTools.cpp(177) :
warning C4385: could be the 'GetNbElements' in base 'CImage<float,3>' of
class 'CImage3D<float>'
E:DevelVolumeInterpolation. avec
Image-nDtesttestVolumeInterpolation_3dFreehandMathTools.cpp(177) :
warning C4385: or the 'GetNbElements' in base 'CContainer3<float>' of
base 'CArray3<float>' of class 'CImage3D<float>'
Pourquoi le compilo trouve-t-il cela ambigu ??
Dois-je utiliser un heritage multiple virtuel meme si CImageNd
et CArray3 n'ont aucun lien de parente ??
je suis confronte a un pb que je ne comprends pas :
J'ai une classe CImageNd qui definit une interface pour des
images n dimensionnelles (n = 2 ou 3, bcp de choses en
commun.) template <class VALUE, size_t DIM>
class CImageNd
{
.....
}
A partir de cette classe, je veux creer 2 types d'images : les
images 2D et les images3D.
Pour cela, j'utilise des types Array2 et Array3 dont je
dispose (libs externes, non modifiables) et mon interface.
template <class VALUE>
class CImage2D : public CImage <VALUE, 2>, protected CArray2<VALU E>
{
}
Comme je ne veux pas que toutes les méthodes de Array2 (resp
Array3) soient accessibles, j'utilise un heritage protege ;
pour l'interface, j'utilise un heritage public.
Comme ma classe d'interface connait bcp de choses, j'ai des
methodes qui portent le meme nom qu dans les classes
Array2(Array3) (par exemple : methode GetNbElements ou Sizeof)
Voici la facon dont je comprends ce qui se passe si je veux
utiliser la methode GetNbElements() sur une CImage3D
CImage3D vol(512,512,512);
vol.GetNbElements();
/*
GetNbElements est publique dans CImageNd et Array3 mais comme
CImage3D herite de facon publique de CImageNd et de facon protegee de
CImage3D ,
c'est CImageNd::GetNbElements() qui est 'appelee'
*/
or le compilo (MSVC++ 6.0, oui je sais mais j'ai pas le choix
:o( ) me dit :
CImage3D<float>::GetNbElements' is ambiguous
E:DevelVolumeInterpolation. avec
Image-nDtesttestVolumeInterpolation_3dFreehandMathTools.cpp(177) :
warning C4385: could be the 'GetNbElements' in base 'CImage<float,3>' of
class 'CImage3D<float>'
E:DevelVolumeInterpolation. avec
Image-nDtesttestVolumeInterpolation_3dFreehandMathTools.cpp(177) :
warning C4385: or the 'GetNbElements' in base 'CContainer3<float>' of
base 'CArray3<float>' of class 'CImage3D<float>'
Pourquoi le compilo trouve-t-il cela ambigu ??
Dois-je utiliser un heritage multiple virtuel meme si CImageNd
et CArray3 n'ont aucun lien de parente ??
je suis confronte a un pb que je ne comprends pas :
J'ai une classe CImageNd qui definit une interface pour des
images n dimensionnelles (n = 2 ou 3, bcp de choses en
commun.) template <class VALUE, size_t DIM>
class CImageNd
{
.....
}
A partir de cette classe, je veux creer 2 types d'images : les
images 2D et les images3D.
Pour cela, j'utilise des types Array2 et Array3 dont je
dispose (libs externes, non modifiables) et mon interface.
template <class VALUE>
class CImage2D : public CImage <VALUE, 2>, protected CArray2<VALU E>
{
}
Comme je ne veux pas que toutes les méthodes de Array2 (resp
Array3) soient accessibles, j'utilise un heritage protege ;
pour l'interface, j'utilise un heritage public.
Comme ma classe d'interface connait bcp de choses, j'ai des
methodes qui portent le meme nom qu dans les classes
Array2(Array3) (par exemple : methode GetNbElements ou Sizeof)
Voici la facon dont je comprends ce qui se passe si je veux
utiliser la methode GetNbElements() sur une CImage3D
CImage3D vol(512,512,512);
vol.GetNbElements();
/*
GetNbElements est publique dans CImageNd et Array3 mais comme
CImage3D herite de facon publique de CImageNd et de facon protegee de
CImage3D ,
c'est CImageNd::GetNbElements() qui est 'appelee'
*/
or le compilo (MSVC++ 6.0, oui je sais mais j'ai pas le choix
:o( ) me dit :
CImage3D<float>::GetNbElements' is ambiguous
E:DevelVolumeInterpolation. avec
Image-nDtesttestVolumeInterpolation_3dFreehandMathTools.cpp(177) :
warning C4385: could be the 'GetNbElements' in base 'CImage<float,3>' of
class 'CImage3D<float>'
E:DevelVolumeInterpolation. avec
Image-nDtesttestVolumeInterpolation_3dFreehandMathTools.cpp(177) :
warning C4385: or the 'GetNbElements' in base 'CContainer3<float>' of
base 'CArray3<float>' of class 'CImage3D<float>'
Pourquoi le compilo trouve-t-il cela ambigu ??
Dois-je utiliser un heritage multiple virtuel meme si CImageNd
et CArray3 n'ont aucun lien de parente ??
Bonjour a tous,
J'ai une classe CImageNd qui definit une interface pour des images n
dimensionnelles (n = 2 ou 3, bcp de choses en commun.)
template <class VALUE, size_t DIM>
class CImageNd
{
}
je veux creer 2 types d'images : les images 2D et images3D
j'utilise des types Array2 et Array3 dont je dispose (libs externes, ...
template <class VALUE>
class CImage2D : public CImage <VALUE, 2>, protected CArray2<VALUE>
{
}
Comme je ne veux pas que toutes les méthodes de Array2 (resp Array3)
soient accessibles, j'utilise un heritage protege ; pour l'interface,
j'utilise un heritage public.
Comme ma classe d'interface connait bcp de choses, j'ai des methodes qui
portent le meme nom qu dans les classes Array2(Array3) (par exemple :
methode GetNbElements ou Sizeof)
Bonjour a tous,
J'ai une classe CImageNd qui definit une interface pour des images n
dimensionnelles (n = 2 ou 3, bcp de choses en commun.)
template <class VALUE, size_t DIM>
class CImageNd
{
}
je veux creer 2 types d'images : les images 2D et images3D
j'utilise des types Array2 et Array3 dont je dispose (libs externes, ...
template <class VALUE>
class CImage2D : public CImage <VALUE, 2>, protected CArray2<VALUE>
{
}
Comme je ne veux pas que toutes les méthodes de Array2 (resp Array3)
soient accessibles, j'utilise un heritage protege ; pour l'interface,
j'utilise un heritage public.
Comme ma classe d'interface connait bcp de choses, j'ai des methodes qui
portent le meme nom qu dans les classes Array2(Array3) (par exemple :
methode GetNbElements ou Sizeof)
Bonjour a tous,
J'ai une classe CImageNd qui definit une interface pour des images n
dimensionnelles (n = 2 ou 3, bcp de choses en commun.)
template <class VALUE, size_t DIM>
class CImageNd
{
}
je veux creer 2 types d'images : les images 2D et images3D
j'utilise des types Array2 et Array3 dont je dispose (libs externes, ...
template <class VALUE>
class CImage2D : public CImage <VALUE, 2>, protected CArray2<VALUE>
{
}
Comme je ne veux pas que toutes les méthodes de Array2 (resp Array3)
soient accessibles, j'utilise un heritage protege ; pour l'interface,
j'utilise un heritage public.
Comme ma classe d'interface connait bcp de choses, j'ai des methodes qui
portent le meme nom qu dans les classes Array2(Array3) (par exemple :
methode GetNbElements ou Sizeof)
vincent daanen wrote:je suis confronte a un pb que je ne comprends pas :
J'ai une classe CImageNd qui definit une interface pour des
images n dimensionnelles (n = 2 ou 3, bcp de choses en
commun.) template <class VALUE, size_t DIM>class CImageNd
{
.....
}A partir de cette classe, je veux creer 2 types d'images : les
images 2D et les images3D.Pour cela, j'utilise des types Array2 et Array3 dont je
dispose (libs externes, non modifiables) et mon interface.template <class VALUE>
class CImage2D : public CImage <VALUE, 2>, protected CArray2<VALUE>
{
}Comme je ne veux pas que toutes les méthodes de Array2 (resp
Array3) soient accessibles, j'utilise un heritage protege ;
pour l'interface, j'utilise un heritage public.
Voire peut-être private ? (Je n'ai jamais vu un cas où
l'héritage protected se justifiait, mais ça ne veut pas dire
qu'il ne peut pas exister.)
je vais essayer mais je ne sais pas si je n'aurais pas a heriter une
Comme ma classe d'interface connait bcp de choses, j'ai des
methodes qui portent le meme nom qu dans les classes
Array2(Array3) (par exemple : methode GetNbElements ou Sizeof)Voici la facon dont je comprends ce qui se passe si je veux
utiliser la methode GetNbElements() sur une CImage3DCImage3D vol(512,512,512);
vol.GetNbElements();/*
GetNbElements est publique dans CImageNd et Array3 mais comme
CImage3D herite de facon publique de CImageNd et de facon protegee de
CImage3D ,
c'est CImageNd::GetNbElements() qui est 'appelee'
*/
C'est CImage3D.GetNbElements() qui serait appelée. Si elle n'a
pas définie de telle fonction, elle en hérite des classes de
base. De toutes les classes de base ; le type d'héritage n'y
change rien.or le compilo (MSVC++ 6.0, oui je sais mais j'ai pas le choix
:o( ) me dit :CImage3D<float>::GetNbElements' is ambiguous
E:DevelVolumeInterpolation. avec
Image-nDtesttestVolumeInterpolation_3dFreehandMathTools.cpp(177) :
warning C4385: could be the 'GetNbElements' in base 'CImage<float,3>' of
class 'CImage3D<float>'
E:DevelVolumeInterpolation. avec
Image-nDtesttestVolumeInterpolation_3dFreehandMathTools.cpp(177) :
warning C4385: or the 'GetNbElements' in base 'CContainer3<float>' of
base 'CArray3<float>' of class 'CImage3D<float>'Pourquoi le compilo trouve-t-il cela ambigu ??
Parce que ça l'est selon les règles du langage. D'abord, le
compilateur cherche une portée avec une déclaration du nom
cherché. Déjà, s'il ne peut pas trouver une portée unique, c'est
ambigu. On ne va pas plus loin. Évidemment, la présence du nom
dans une portée peut masquer sa présence dans une autre ; s'il
est présent dans une classe dérivée, par exemple, on ne le
trouvera jamais dans une classe de base (de cette dérivée). Mais
ici, si le même nom est présent dans les deux classes de base,
il n'y a pas de masquage. (Il y a des règles supplémentaires qui
peuvent ajouter des noms à cause de la recherche dépendente des
paramètres, mais elles ne s'appliquent pas ici. Et elles ne sont
pas encore implémentées dans VC++6.0 non plus.)
Merci pour cette info ! C'est cela qui m'a induit en erreur ! Je pensais
Dois-je utiliser un heritage multiple virtuel meme si CImageNd
et CArray3 n'ont aucun lien de parente ??
Ça pourrait être une solution. Si CImageNd hérite de CArray3, des
symboles dans CImageNd auront toujour précédence.
Non, CImageND n'herite pas de CArray3 ! J'ai ecrit une reflexion sans
Sinon, selon
le cas : n'utilise que des pointeurs à CImageNd. À partir d'un
pointeur à CImageNd, tu n'arriveras jamais à une fonction dans
CArray3. Et le plus propre : définir tous les symboles que tu
veux avoir visible dans CImage3D dans CImage3D -- une fonction
de renvoie à la fonction réelement voulue ferait l'affaire. Dans
du C++ moderne, il y a même un mechanisme pour faire ça plus
simplement, avec des using, mais je ne crois pas que VC++6.0 le
supporte.
J'ai effectivement utilise des directives using et ca marche tres bien !
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
vincent daanen wrote:
je suis confronte a un pb que je ne comprends pas :
J'ai une classe CImageNd qui definit une interface pour des
images n dimensionnelles (n = 2 ou 3, bcp de choses en
commun.) template <class VALUE, size_t DIM>
class CImageNd
{
.....
}
A partir de cette classe, je veux creer 2 types d'images : les
images 2D et les images3D.
Pour cela, j'utilise des types Array2 et Array3 dont je
dispose (libs externes, non modifiables) et mon interface.
template <class VALUE>
class CImage2D : public CImage <VALUE, 2>, protected CArray2<VALUE>
{
}
Comme je ne veux pas que toutes les méthodes de Array2 (resp
Array3) soient accessibles, j'utilise un heritage protege ;
pour l'interface, j'utilise un heritage public.
Voire peut-être private ? (Je n'ai jamais vu un cas où
l'héritage protected se justifiait, mais ça ne veut pas dire
qu'il ne peut pas exister.)
je vais essayer mais je ne sais pas si je n'aurais pas a heriter une
Comme ma classe d'interface connait bcp de choses, j'ai des
methodes qui portent le meme nom qu dans les classes
Array2(Array3) (par exemple : methode GetNbElements ou Sizeof)
Voici la facon dont je comprends ce qui se passe si je veux
utiliser la methode GetNbElements() sur une CImage3D
CImage3D vol(512,512,512);
vol.GetNbElements();
/*
GetNbElements est publique dans CImageNd et Array3 mais comme
CImage3D herite de facon publique de CImageNd et de facon protegee de
CImage3D ,
c'est CImageNd::GetNbElements() qui est 'appelee'
*/
C'est CImage3D.GetNbElements() qui serait appelée. Si elle n'a
pas définie de telle fonction, elle en hérite des classes de
base. De toutes les classes de base ; le type d'héritage n'y
change rien.
or le compilo (MSVC++ 6.0, oui je sais mais j'ai pas le choix
:o( ) me dit :
CImage3D<float>::GetNbElements' is ambiguous
E:DevelVolumeInterpolation. avec
Image-nDtesttestVolumeInterpolation_3dFreehandMathTools.cpp(177) :
warning C4385: could be the 'GetNbElements' in base 'CImage<float,3>' of
class 'CImage3D<float>'
E:DevelVolumeInterpolation. avec
Image-nDtesttestVolumeInterpolation_3dFreehandMathTools.cpp(177) :
warning C4385: or the 'GetNbElements' in base 'CContainer3<float>' of
base 'CArray3<float>' of class 'CImage3D<float>'
Pourquoi le compilo trouve-t-il cela ambigu ??
Parce que ça l'est selon les règles du langage. D'abord, le
compilateur cherche une portée avec une déclaration du nom
cherché. Déjà, s'il ne peut pas trouver une portée unique, c'est
ambigu. On ne va pas plus loin. Évidemment, la présence du nom
dans une portée peut masquer sa présence dans une autre ; s'il
est présent dans une classe dérivée, par exemple, on ne le
trouvera jamais dans une classe de base (de cette dérivée). Mais
ici, si le même nom est présent dans les deux classes de base,
il n'y a pas de masquage. (Il y a des règles supplémentaires qui
peuvent ajouter des noms à cause de la recherche dépendente des
paramètres, mais elles ne s'appliquent pas ici. Et elles ne sont
pas encore implémentées dans VC++6.0 non plus.)
Merci pour cette info ! C'est cela qui m'a induit en erreur ! Je pensais
Dois-je utiliser un heritage multiple virtuel meme si CImageNd
et CArray3 n'ont aucun lien de parente ??
Ça pourrait être une solution. Si CImageNd hérite de CArray3, des
symboles dans CImageNd auront toujour précédence.
Non, CImageND n'herite pas de CArray3 ! J'ai ecrit une reflexion sans
Sinon, selon
le cas : n'utilise que des pointeurs à CImageNd. À partir d'un
pointeur à CImageNd, tu n'arriveras jamais à une fonction dans
CArray3. Et le plus propre : définir tous les symboles que tu
veux avoir visible dans CImage3D dans CImage3D -- une fonction
de renvoie à la fonction réelement voulue ferait l'affaire. Dans
du C++ moderne, il y a même un mechanisme pour faire ça plus
simplement, avec des using, mais je ne crois pas que VC++6.0 le
supporte.
J'ai effectivement utilise des directives using et ca marche tres bien !
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
vincent daanen wrote:je suis confronte a un pb que je ne comprends pas :
J'ai une classe CImageNd qui definit une interface pour des
images n dimensionnelles (n = 2 ou 3, bcp de choses en
commun.) template <class VALUE, size_t DIM>class CImageNd
{
.....
}A partir de cette classe, je veux creer 2 types d'images : les
images 2D et les images3D.Pour cela, j'utilise des types Array2 et Array3 dont je
dispose (libs externes, non modifiables) et mon interface.template <class VALUE>
class CImage2D : public CImage <VALUE, 2>, protected CArray2<VALUE>
{
}Comme je ne veux pas que toutes les méthodes de Array2 (resp
Array3) soient accessibles, j'utilise un heritage protege ;
pour l'interface, j'utilise un heritage public.
Voire peut-être private ? (Je n'ai jamais vu un cas où
l'héritage protected se justifiait, mais ça ne veut pas dire
qu'il ne peut pas exister.)
je vais essayer mais je ne sais pas si je n'aurais pas a heriter une
Comme ma classe d'interface connait bcp de choses, j'ai des
methodes qui portent le meme nom qu dans les classes
Array2(Array3) (par exemple : methode GetNbElements ou Sizeof)Voici la facon dont je comprends ce qui se passe si je veux
utiliser la methode GetNbElements() sur une CImage3DCImage3D vol(512,512,512);
vol.GetNbElements();/*
GetNbElements est publique dans CImageNd et Array3 mais comme
CImage3D herite de facon publique de CImageNd et de facon protegee de
CImage3D ,
c'est CImageNd::GetNbElements() qui est 'appelee'
*/
C'est CImage3D.GetNbElements() qui serait appelée. Si elle n'a
pas définie de telle fonction, elle en hérite des classes de
base. De toutes les classes de base ; le type d'héritage n'y
change rien.or le compilo (MSVC++ 6.0, oui je sais mais j'ai pas le choix
:o( ) me dit :CImage3D<float>::GetNbElements' is ambiguous
E:DevelVolumeInterpolation. avec
Image-nDtesttestVolumeInterpolation_3dFreehandMathTools.cpp(177) :
warning C4385: could be the 'GetNbElements' in base 'CImage<float,3>' of
class 'CImage3D<float>'
E:DevelVolumeInterpolation. avec
Image-nDtesttestVolumeInterpolation_3dFreehandMathTools.cpp(177) :
warning C4385: or the 'GetNbElements' in base 'CContainer3<float>' of
base 'CArray3<float>' of class 'CImage3D<float>'Pourquoi le compilo trouve-t-il cela ambigu ??
Parce que ça l'est selon les règles du langage. D'abord, le
compilateur cherche une portée avec une déclaration du nom
cherché. Déjà, s'il ne peut pas trouver une portée unique, c'est
ambigu. On ne va pas plus loin. Évidemment, la présence du nom
dans une portée peut masquer sa présence dans une autre ; s'il
est présent dans une classe dérivée, par exemple, on ne le
trouvera jamais dans une classe de base (de cette dérivée). Mais
ici, si le même nom est présent dans les deux classes de base,
il n'y a pas de masquage. (Il y a des règles supplémentaires qui
peuvent ajouter des noms à cause de la recherche dépendente des
paramètres, mais elles ne s'appliquent pas ici. Et elles ne sont
pas encore implémentées dans VC++6.0 non plus.)
Merci pour cette info ! C'est cela qui m'a induit en erreur ! Je pensais
Dois-je utiliser un heritage multiple virtuel meme si CImageNd
et CArray3 n'ont aucun lien de parente ??
Ça pourrait être une solution. Si CImageNd hérite de CArray3, des
symboles dans CImageNd auront toujour précédence.
Non, CImageND n'herite pas de CArray3 ! J'ai ecrit une reflexion sans
Sinon, selon
le cas : n'utilise que des pointeurs à CImageNd. À partir d'un
pointeur à CImageNd, tu n'arriveras jamais à une fonction dans
CArray3. Et le plus propre : définir tous les symboles que tu
veux avoir visible dans CImage3D dans CImage3D -- une fonction
de renvoie à la fonction réelement voulue ferait l'affaire. Dans
du C++ moderne, il y a même un mechanisme pour faire ça plus
simplement, avec des using, mais je ne crois pas que VC++6.0 le
supporte.
J'ai effectivement utilise des directives using et ca marche tres bien !
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34