Linker Error: Abstract base and 2 derived classes in singleton pattern
Hello all,
This is my first message to the group.
I have a question where i derive 2 child classes which are of
singleton pattern from an abstract base class.
Code:
//********************************************** test1.h
*******************************//
#include <iostream>
using namespace std;
class CPolygon {
protected:
int width, height;
public:
CPolygon(){};
virtual ~CPolygon(){};
void set_values (int a, int b)
{ width=a; height=b; }
virtual int area (void) = 0;
void printarea (void)
{ cout << this->area() << endl; }
};
class CRectangle: public CPolygon {
public:
int area (void)
{ return (width * height); }
static CRectangle* GetInstance()
{ if (!rectanglePtr) rectanglePtr = new CRectangle(); return
rectanglePtr; }
~CRectangle();
protected:
CRectangle();
static CRectangle* rectanglePtr;
CRectangle(CRectangle const&){};
CRectangle& operator=(CRectangle&){};
};
CRectangle* CRectangle::rectanglePtr = NULL;
class CTriangle: public CPolygon {
public:
int area (void)
{ return (width * height / 2); }
static CTriangle* GetInstance()
{ if (!trianglePtr) trianglePtr = new CTriangle(); return
trianglePtr; }
~CTriangle();
protected:
CTriangle();
static CTriangle* trianglePtr;
CTriangle(CTriangle const&){}
CTriangle& operator=(CTriangle&){};
};
CTriangle* CTriangle::trianglePtr = NULL;
//******************************************* test1.cpp
*******************//
#include "test1.h"
int main (void)
{
CPolygon *ppoly1 = CRectangle::GetInstance();
CTriangle *ppoly2 = CTriangle::GetInstance();
ppoly1->set_values (4,5);
ppoly2->set_values (4,5);
ppoly1->printarea();
ppoly2->printarea();
delete ppoly1;
delete ppoly2;
return 0;
}
so when i compile and link them
this is the error am looking at ....
[root@Krea-TV-DT1 IMGAdapter]# g++ -o test1.out test1.o
test1.o: In function `CRectangle::GetInstance()':
test1.cpp:
(.text._ZN10CRectangle11GetInstanceEv[CRectangle::GetInstance()]+0xa):
undefined reference to `CRectangle::rectanglePtr'
test1.cpp:
(.text._ZN10CRectangle11GetInstanceEv[CRectangle::GetInstance()]
+0x26): undefined reference to `CRectangle::CRectangle()'
test1.cpp:
(.text._ZN10CRectangle11GetInstanceEv[CRectangle::GetInstance()]
+0x47): undefined reference to `CRectangle::rectanglePtr'
test1.cpp:
(.text._ZN10CRectangle11GetInstanceEv[CRectangle::GetInstance()]
+0x4c): undefined reference to `CRectangle::rectanglePtr'
test1.o: In function `CTriangle::GetInstance()':
test1.cpp:
(.text._ZN9CTriangle11GetInstanceEv[CTriangle::GetInstance()]
+0xa): undefined reference to `CTriangle::trianglePtr'
test1.cpp:
(.text._ZN9CTriangle11GetInstanceEv[CTriangle::GetInstance()]
+0x26): undefined reference to `CTriangle::CTriangle()'
test1.cpp:
(.text._ZN9CTriangle11GetInstanceEv[CTriangle::GetInstance()]
+0x47): undefined reference to `CTriangle::trianglePtr'
test1.cpp:
(.text._ZN9CTriangle11GetInstanceEv[CTriangle::GetInstance()]
+0x4c): undefined reference to `CTriangle::trianglePtr'
collect2: ld returned 1 exit status
Please let me know as to what mistake am i doing .
Thanks,
Vinesh.S