Je vais décrire la situation plus globalement
Je développe une interface graphique pour l'embarqué. Le framework m'offre les classes suivantes:
- Drawable qui est abstraite (avec quelques méthodes virtuelles pures)
- Container qui est n'est pas abstraite et qui hérite publiquement de Drawable. C'est une sorte de composite / layout. Elle ajoute notamment une méthode add(Drawable)
Je crée des layouts personnalisés, donc des classes héritant de Container. J'ai notamment ceci :
1 2 3 4 5
| class Layout_1 : public Container
{
public:
void setTitle(Drawable& top);
} |
Comme Layout_1 dérive de Container, je peux faire ceci :
1 2 3
| Label label("title");
Layout_1 layout;
layout.add(label); |
Sauf que add() ne faire rien visuellement, c'est un peu un méthode interne... Je me demande d'ailleurs pourquoi Container n'est pas abstraite et add() protected mais passons... J'aurais aimé la masquer pour que l'API de mon Layout_1 soit simple à utiliser correctement et difficile à utiliser incorrectement (http://programmer.97things.oreilly.c...se_Incorrectly). Cette histoire de réduire la visibilité n'est pas une bonne solution.
Mon idée suivante a donc été celle-ci :
1 2 3
| class Layout_1 : private Container, public Drawable
{
}; |
Sauf que bien sûr je me retrouve avec des tas d'erreurs :
"C:\Program Files\JetBrains\CLion 2017.2\bin\cmake\bin\cmake.exe" --build C:\Users\X-pigradot\svn\0373_AI_Island_Delight_trunk\cmake-build-debug --target aivg-delight-simulation -- -j 2
Scanning dependencies of target aivg-delight-simulation
[ 1%] Building CXX object CMakeFiles/aivg-delight-simulation.dir/simulator/source/main.cpp.obj
In file included from C:\Users\X-pigradot\svn\0373_AI_Island_Delight_trunk\simulator\source\main.cpp:10:0:
C:/Users/X-pigradot/svn/0373_AI_Island_Delight_trunk/Software/application/Common/delight/page/TestPage.hpp:60:7: warning: direct base 'touchgfx::Drawable' inaccessible in 'Layout_1' due to ambiguity
class Layout_1 : private Container, public Drawable
^
C:/Users/X-pigradot/svn/0373_AI_Island_Delight_trunk/Software/application/Common/delight/page/TestPage.hpp:144:14: error: cannot declare field 'TestPage::layout_m' to be of abstract type 'Layout_1'
Layout_1 layout_m;
^
C:/Users/X-pigradot/svn/0373_AI_Island_Delight_trunk/Software/application/Common/delight/page/TestPage.hpp:60:7: note: because the following virtual functions are pure within 'Layout_1':
class Layout_1 : private Container, public Drawable
^
In file included from C:/Users/X-pigradot/svn/0373_AI_Island_Delight_trunk/Software/touchgfx/framework/include/touchgfx/containers/Container.hpp:42:0,
from C:/Users/X-pigradot/svn/0373_AI_Island_Delight_trunk/Software/touchgfx/framework/include/touchgfx/Screen.hpp:46,
from C:/Users/X-pigradot/svn/0373_AI_Island_Delight_trunk/Software/application/Common/delight/page/Page.hpp:4,
from C:/Users/X-pigradot/svn/0373_AI_Island_Delight_trunk/Software/application/Common/delight/page/TestPage.hpp:4,
from C:\Users\X-pigradot\svn\0373_AI_Island_Delight_trunk\simulator\source\main.cpp:10:
C:/Users/X-pigradot/svn/0373_AI_Island_Delight_trunk/Software/touchgfx/framework/include/touchgfx/Drawable.hpp:113:18: note: virtual void touchgfx::Drawable::draw(const touchgfx::Rect&) const
virtual void draw(const Rect& invalidatedArea) const = 0;
^
C:/Users/X-pigradot/svn/0373_AI_Island_Delight_trunk/Software/touchgfx/framework/include/touchgfx/Drawable.hpp:129:18: note: virtual touchgfx::Rect touchgfx::Drawable::getSolidRect() const
virtual Rect getSolidRect() const = 0;
^
C:/Users/X-pigradot/svn/0373_AI_Island_Delight_trunk/Software/touchgfx/framework/include/touchgfx/Drawable.hpp:202:18: note: virtual void touchgfx::Drawable::getLastChild(int16_t, int16_t, touchgfx::Drawable**)
virtual void getLastChild(int16_t x, int16_t y, Drawable** last) = 0;
^
In file included from C:\Users\X-pigradot\svn\0373_AI_Island_Delight_trunk\simulator\source\main.cpp:10:0:
C:/Users/X-pigradot/svn/0373_AI_Island_Delight_trunk/Software/application/Common/delight/page/TestPage.hpp: In member function 'virtual void TestPage::setupScreen()':
C:/Users/X-pigradot/svn/0373_AI_Island_Delight_trunk/Software/application/Common/delight/page/TestPage.hpp:126:44: error: 'touchgfx::Drawable' is an ambiguous base of 'Layout_1'
layout_m.setPosition(0, 0, 320, 240);
^
C:/Users/X-pigradot/svn/0373_AI_Island_Delight_trunk/Software/application/Common/delight/page/TestPage.hpp:126: confused by earlier errors, bailing out
J'ai essayé de rajouter ceci dans ma classe, mais ça n'a pas eu l'effet désiré...
1 2 3 4 5
| public:
using Container::draw;
using Container::getSolidRect;
using Container::setPosition;
using Container::getLastChild; |
Partager