Re: Linker Error: Abstract base and 2 derived classes in singleton
pattern
On 8/19/2011 2:26 PM, Vinesh S wrote:
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:
General:
* Don't bother prefixing your classes with "C". That's an
MFC-ism and is generally unnecessary.
* void param lists are unnecessary. Use void f(), instead of
void f(void).
//********************************************** 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&){};
};
Where are CRectangle() and ~CRectangle() defined?
This should probably not be in a header (though for this
toy example it works)
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&){};
};
This should probably not be in a header (though for this
toy example it works)
CTriangle* CTriangle::trianglePtr = NULL;
Similarly, where are CTriangle() and ~CTriangle()
defined()
//******************************************* 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;
}
I don't see what's wrong with the static members,
but you do have to declare those missing constructors
and destructors.