Hey allemaal. Ik heb een ontwerp waarbij ik drie classes heb, namelijk Scanner, Scanner3D en Scanner3DLaserScanner. Scanner en Scanner3D zijn abstracte classes, waar Scanner3DLaserScanner een daadwerkelijke implementatie is. Als ik de volgende constructie echter probeer, krijg ik een foutmelding.
geeft:
- Scanner: algemene class, defineert wat elke scanner moet kunnen
- Scanner3D: erft van Scanner, defineert wat 3D scanners extra moeten kunnen
- Scanner3DLaserScanner: erft van Scanner3D en bevat de daadwerkelijke implementatie
Eerst eens even de header files, volgens mij zijn die verder in orde. De methodes die geimplementeerd moeten worden, zijn ook geimplementeerd.
En de constructors zien er als volgt uit:
Uiteindelijk komt mijn probleem dus neer op dat ik geen base class kan gebruiken om het type aan te geven. Het is de bedoeling dat er een soort van controller class is die weet welke scanner er gebruikt moet worden, maar daar wil ik natuurlijk het type 'Scanner3D' voor gebruiken zodat ik niet hoef aan te geven om welke concrete implementatie het gaat, maar dat doet 't om een of andere reden dus niet. Ik stel het erg op prijs dat jullie al tot zo ver gekomen zijn met lezen
Thanks alvast!
C++:
1
| Scanner3D scanner = new Scanner3DLaserScanner(); |
geeft:
code:
1
| C2259: 'Scanner3D' : cannot instantiate abstract class |
- Scanner: algemene class, defineert wat elke scanner moet kunnen
- Scanner3D: erft van Scanner, defineert wat 3D scanners extra moeten kunnen
- Scanner3DLaserScanner: erft van Scanner3D en bevat de daadwerkelijke implementatie
Eerst eens even de header files, volgens mij zijn die verder in orde. De methodes die geimplementeerd moeten worden, zijn ook geimplementeerd.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
| ////////////////////////////////////////////////////////////////////////////// // Scanner.h class Scanner { protected: wxString m_Description; protected: Scanner(wxString description); public: wxString GetDescription() const; virtual bool Initialize() const = 0; virtual bool Scan() const = 0; }; ////////////////////////////////////////////////////////////////////////////// // Scanner3D.h #include "Scanner.h" #include "ScanMode3D.h" class Scanner3D : public Scanner { protected: Scanner3D(); public: // Van deze twee weet ik niet zeker of ze wel nodig zijn op deze plek virtual bool Initialize() const = 0; virtual bool Scan() const = 0; virtual void SetMode(ScanMode3D mode) = 0; }; ////////////////////////////////////////////////////////////////////////////// // Scanner3DLaserScanner.h #include "Scanner3D.h" #include "ScanMode3D.h" class Scanner3DLaserScanner : public Scanner3D { public: Scanner3DLaserScanner(); // Scanner implementation bool Initialize() const; bool Scan() const; // 3D scanner implementation void SetMode(ScanMode3D mode); }; |
En de constructors zien er als volgt uit:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
| Scanner::Scanner(wxString description) { m_Description = description; } Scanner3D::Scanner3D() : Scanner("3d") { } Scanner3DLaserScanner::Scanner3DLaserScanner() : Scanner3D() { } |
Uiteindelijk komt mijn probleem dus neer op dat ik geen base class kan gebruiken om het type aan te geven. Het is de bedoeling dat er een soort van controller class is die weet welke scanner er gebruikt moet worden, maar daar wil ik natuurlijk het type 'Scanner3D' voor gebruiken zodat ik niet hoef aan te geven om welke concrete implementatie het gaat, maar dat doet 't om een of andere reden dus niet. Ik stel het erg op prijs dat jullie al tot zo ver gekomen zijn met lezen