Singleton Pattern in Managed c++ ?

Status
Niet open voor verdere reacties.

teyeheimans

Nieuwe gebruiker
Lid geworden
8 apr 2006
Berichten
4
Hej All,

Ik probeer het singleton pattern toe te passen op een managed c++ class. Dit wil echter niet echt lukken. In een unmanaged class wil het wel:

Star.h
Code:
class Star : public State
{
	private:
	  static Star *theInstance;
	public:
	  static Star *instance();
	  void handle( Filter &filter, char n );
};

Star.cpp
Code:
Star* Star::theInstance = NULL;
Star* Star::instance()
{
  if(theInstance == NULL) theInstance = new Star();
  return theInstance;
}

void Star::handle( Filter &filter, char n )
{
	// ...
	
}

bovenstaand werkt dus GOED.

Echter, dit werkt dus niet:

RectangleDrawer.h
Code:
namespace Opdracht5
{
    using namespace System::Drawing;

    ref class RectangleDrawer : ShapeDrawer
    {
    private:
        static RectangleDrawer^ instance;
        RectangleDrawer() {};
    public:
        virtual void DrawShape( Graphics ^g, int x, int y, int w, int h ) override;
        static RectangleDrawer^ getInstance();
    };
}

RectangleDrawer.cpp
Code:
using namespace System::Drawing;

Opdracht5::RectangleDrawer::instance = NULL;
RectangleDrawer^ Opdracht5::RectangleDrawer::getInstance()
{
    if(instance == NULL) instance = gcnew RetangleDrawer();
    return instance;
}

void Opdracht5::RectangleDrawer::DrawShape( Graphics ^g, int x, int y, int w, int h )
{    
    // ...
}

Dit werkt dus NIET.

Lijst met errors:
Code:
Error	1	error C4430: missing type specifier - int assumed. Note: C++ does not support default-int	c:\map\Visual Studio 2005\Projects\DesignPatterns\Opdracht5\RectangleDrawer.cpp	13
Error	2	error C2373: 'instance' : redefinition; different type modifiers		c:\map\Visual Studio 2005\Projects\DesignPatterns\Opdracht5\RectangleDrawer.cpp	13
Error	3	error C3366: 'Opdracht5::RectangleDrawer::instance' : static data members of managed types must be defined within the class definition		c:\map\Visual Studio 2005\Projects\DesignPatterns\Opdracht5\RectangleDrawer.cpp	13
Error	4	error C2065: 'NULL' : undeclared identifier		c:\map\Visual Studio 2005\Projects\DesignPatterns\Opdracht5\RectangleDrawer.cpp	13
Error	5	error C2556: 'int Opdracht5::RectangleDrawer::getInstance(void)' : overloaded function differs only by return type from 'Opdracht5::RectangleDrawer ^Opdracht5::RectangleDrawer::getInstance(void)'		c:\map\Visual Studio 2005\Projects\DesignPatterns\Opdracht5\RectangleDrawer.cpp	15
Error	6	error C2373: 'Opdracht5::RectangleDrawer::getInstance' : redefinition; different type modifiers		c:\map\Projects\DesignPatterns\Opdracht5\RectangleDrawer.cpp	15
Error	7	error C2061: syntax error : identifier 'RetangleDrawer'		c:\map\Visual Studio 2005\Projects\DesignPatterns\Opdracht5\RectangleDrawer.cpp	16

Iemand een idee wat ik fout doe?
 
Laatst bewerkt:
opgelost!

Ik heb ff een slimme klasgenoot gevraagd welke toevallig online kwam en hij wist me te vertellen wat er mis was.

Ten eerste stond er dit:

Code:
instance = gcnew RetangleDrawer();

De c miste in Rectangle.

Verder bestaat null niet in deze managed c++ ?? Het is iig hier nullptr.
De declaratie van instance = null moest in de klasse. Tot slot moest er voor de return value van de getInstance nog Opdracht5:: staan. Dit is het uiteindelijke resultaat:

header file:
Code:
#pragma once
#include "ShapeDrawer.h"

namespace Opdracht5
{
    using namespace System::Drawing;

    ref class RectangleDrawer : ShapeDrawer
    {
    private:
        static RectangleDrawer^ instance = nullptr;
        RectangleDrawer() {};    
    public:    
        virtual void DrawShape( Graphics ^g, int x, int y, int w, int h ) override;
        static RectangleDrawer^ getInstance();
    };
}

Cpp file:
Code:
#include "StdAfx.h"
#include "RectangleDrawer.h"

using namespace System::Drawing;

void Opdracht5::RectangleDrawer::DrawShape( Graphics ^g, int x, int y, int w, int h )
{    
    Pen ^p = gcnew Pen( Color::Black );
    
    g->DrawRectangle( p, x, y, w, h );    
}

Opdracht5::RectangleDrawer^ Opdracht5::RectangleDrawer::getInstance()
{
    if(instance == nullptr) instance = gcnew RectangleDrawer();
    return instance;
}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan