In mijn c++ project heb ik nu een 'abstracte' class (ben vooral bekend met Java, dus zal waarschijnlijk ook veel javatermen gebruiken
). Vervolgens heb ik een implementatie die deze class extend. Ik zal hieronder even de beide header files plaatsten:
MTAttribute.h
InertiaAttribute.h
Als ik dit vervolgens ga compileren is er niks aan de hand todat de verschillende .o files moeten worden gelinked. Ik krijg dan de volgende melding:
wingtip54 : ~/afprog/5 > make
g++ test.o MaxTree3d.o ShortVolume.o MTAttribute.o InertiaAttribute.o -o "filter.exe" -lglut -lGLU -lGL -lpthread -L/usr/X11R6/lib -lXi -lXmu -lXext -lXt -lX11 -O6 -march=i686 -fexpensive-optimizations -funroll-loops -Wall
InertiaAttribute.o: In function `InertiaAttribute::getNewInstance(void)':
InertiaAttribute.o(.text+0x7c): undefined reference to `MTAttribute::~MTAttribute(void)'
InertiaAttribute.o: In function `InertiaAttribute::InertiaAttribute(void)':
InertiaAttribute.o(.text+0x11b): undefined reference to `MTAttribute::~MTAttribute(void)'
InertiaAttribute.o: In function `InertiaAttribute::InertiaAttribute(InertiaAttribute const &)':
InertiaAttribute.o(.text+0x18b): undefined reference to `MTAttribute::~MTAttribute(void)'
InertiaAttribute.o: In function `InertiaAttribute::~InertiaAttribute(void)':
InertiaAttribute.o(.text+0x1e3): undefined reference to `MTAttribute::~MTAttribute(void)'
InertiaAttribute.o: In function `InertiaAttribute::InertiaAttribute(unsigned long, unsigned long, unsigned long)':
InertiaAttribute.o(.text+0x247): undefined reference to `MTAttribute::~MTAttribute(void)'
collect2: ld returned 1 exit status
make: *** [filter.exe] Error 1
Ik ben zo langzamerhand een beetje ten einde raad. Zoals is te zien geeft ie bij alle constructoren van de subclass aan dat hij de constructor van de abstracte class niet kan vinden. Ook bij getNewInstance geeft hij deze melding, maar dat zal waartschijnlijk komen omdat ik daar een nieuwe instantie van de class aanmaak en hierin dus ook de constructor wordt aangeroepen. Waarschijnlijk ligt het probleem ergens in de makefile, maar dat weet ik absoluut niet zeker.
Ik maak geen gebruik van een IDE omdat deze hier niet aanwezig is. De makefile heb ik dus met de hand moeten maken mbv enkele voorbeelden. Is er iemand die weet waar dit door zou kunnen komen en hoe ik het op kan lossen?
Als er eventueel meer info nodig is (makefile, beide cpp bestanden), vraag maar, dan zet ik het er ook wel ff bij.
MTAttribute.h
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| #ifndef MTAttribute_h
#define MTAttribute_h
#include <iostream>
class MTAttribute {
public:
MTAttribute();
MTAttribute(const MTAttribute& mta);
virtual ~MTAttribute() = 0;
MTAttribute(unsigned long x, unsigned long y, unsigned long z);
virtual MTAttribute * getNewInstance() =0;
virtual void addData(unsigned long x, unsigned long y, unsigned long z) = 0;
virtual void mergeAttribute(const MTAttribute& mta) = 0;
virtual double getAttribute() = 0;
private:
};
#endif /* MTAttribute_h */ |
InertiaAttribute.h
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| #ifndef InertiaAttribute_h
#define InertiaAttribute_h
#include "MTAttribute.h"
class InertiaAttribute : public MTAttribute {
public:
InertiaAttribute();
InertiaAttribute(const InertiaAttribute& mta);
~InertiaAttribute();
InertiaAttribute(unsigned long x, unsigned long y, unsigned long z);
MTAttribute * getNewInstance();
void addData(unsigned long x, unsigned long y, unsigned long z);
void mergeAttribute(const MTAttribute& mta);
double getAttribute();
private:
};
#endif /* InertiaAttribute_h */ |
Als ik dit vervolgens ga compileren is er niks aan de hand todat de verschillende .o files moeten worden gelinked. Ik krijg dan de volgende melding:
wingtip54 : ~/afprog/5 > make
g++ test.o MaxTree3d.o ShortVolume.o MTAttribute.o InertiaAttribute.o -o "filter.exe" -lglut -lGLU -lGL -lpthread -L/usr/X11R6/lib -lXi -lXmu -lXext -lXt -lX11 -O6 -march=i686 -fexpensive-optimizations -funroll-loops -Wall
InertiaAttribute.o: In function `InertiaAttribute::getNewInstance(void)':
InertiaAttribute.o(.text+0x7c): undefined reference to `MTAttribute::~MTAttribute(void)'
InertiaAttribute.o: In function `InertiaAttribute::InertiaAttribute(void)':
InertiaAttribute.o(.text+0x11b): undefined reference to `MTAttribute::~MTAttribute(void)'
InertiaAttribute.o: In function `InertiaAttribute::InertiaAttribute(InertiaAttribute const &)':
InertiaAttribute.o(.text+0x18b): undefined reference to `MTAttribute::~MTAttribute(void)'
InertiaAttribute.o: In function `InertiaAttribute::~InertiaAttribute(void)':
InertiaAttribute.o(.text+0x1e3): undefined reference to `MTAttribute::~MTAttribute(void)'
InertiaAttribute.o: In function `InertiaAttribute::InertiaAttribute(unsigned long, unsigned long, unsigned long)':
InertiaAttribute.o(.text+0x247): undefined reference to `MTAttribute::~MTAttribute(void)'
collect2: ld returned 1 exit status
make: *** [filter.exe] Error 1
Ik ben zo langzamerhand een beetje ten einde raad. Zoals is te zien geeft ie bij alle constructoren van de subclass aan dat hij de constructor van de abstracte class niet kan vinden. Ook bij getNewInstance geeft hij deze melding, maar dat zal waartschijnlijk komen omdat ik daar een nieuwe instantie van de class aanmaak en hierin dus ook de constructor wordt aangeroepen. Waarschijnlijk ligt het probleem ergens in de makefile, maar dat weet ik absoluut niet zeker.
Ik maak geen gebruik van een IDE omdat deze hier niet aanwezig is. De makefile heb ik dus met de hand moeten maken mbv enkele voorbeelden. Is er iemand die weet waar dit door zou kunnen komen en hoe ik het op kan lossen?
Als er eventueel meer info nodig is (makefile, beide cpp bestanden), vraag maar, dan zet ik het er ook wel ff bij.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'