» »

[C++]Instanca razreda

[C++]Instanca razreda

robbe ::

Zanima me kako napišem metodo za instanco razreda. Probal sem na ta način, pa ne gre.
class Razred{
private: static Razred instance;
               Razred(){}
public: static Razred getInstance(){
            if(instance==NULL)
                           instance = new Razred();
            return instance;
            }
};

void main(){
Razred obj = Razred.getInstance();
}

Quikee ::

To kar si napisal je "singleton". klik

robbe ::

Jao, točn! Singleton je. No to kodo mi je v bistvu profesor napisal, naj s tem tem probam da bom imel samo eno instanco razreda, ter da se bom tako otresel statičnih metod.

PS: Sem si pogledal primer, ki si mi ga dal, vendar kako naj zdaj ustvarim razred?
Razred::getInstance()->metoda();
//ali
Razred *obj = Razred::getInstance();

//ali kako drugače?

Zgodovina sprememb…

  • spremenil: robbe ()

Gundolf ::

Oboje je ok.

robbe ::

Nobeno od tega mi ne dela. Koda je sledeča:
//razred
class Zajemanje {
private: 
static Zajemanje *instanca;
Zajemanje()
    {
         instanca = NULL;
    }
public:
static Zajemanje* getInstance()
    {
       if(!instanca)
          instanca = new Zajemanje();
       return instanca;
    }
};
//prog.
Zajemanje *obj = Zajemanje::getInstance();
obj->metoda();



Javi pa napako: [Linker Error] Unresolved external 'Zajemanje::instanca' referenced from \UNIT1.OBJ

Kaj bi bilo lahko narobe nimam pojma.Tudi če kličem metode tako Razred::getInstance()->metoda(); mi javi isto. Delam pa v Borlandu 5.0 Pro.

Quikee ::

Če boš ločil deklaracijo in definicijo razreda, kot je navada v C++, več ne boš mel teh težav (vsaj jaz jih nimam).
#include <iostream>

class Razred {
private: 
	int value;
	static Razred* instance;

	Razred();
	Razred(Razred const&);
	
public: 
	static Razred* getInstance();
	int getValue();
	void setValue(int value);
};

Razred* Razred::instance = NULL;

Razred::Razred(){}

Razred* Razred::getInstance()
{
	if(!instance)
			instance = new Razred();
		return instance;
}

int Razred::getValue() 
{
	return value;
}

void Razred::setValue(int value)
{
	this->value = value;
}

int main()
{
	Razred* obj = Razred::getInstance();
	obj->setValue(1);
	obj = Razred::getInstance();
	std::cout<<obj->getValue()<<std::endl;

	return 0;
}


BTW: Kot opozorilo - Ta implementacija singletona ni thread safe!

Zgodovina sprememb…

  • spremenil: Quikee ()

Vesoljc ::

leak-free tudi ne ;)
Abnormal behavior of abnormal brain makes me normal...

y00r3 ::

Zakaj pa ne? :\
delete Razred::getInstance();

Senitel ::

Kaj pa če je Razred v DLL-ju? Potem bo tale tvoja rešitev naredila tak lep exception...
Razred mora spucat za sabo.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

c++ rabim pomoč konstuktorji

Oddelek: Programiranje
61098 (793) Snowflake2
»

Java program (strani: 1 2 )

Oddelek: Programiranje
508584 (7733) kunigunda
»

[c#] loopanje po fieldih classa

Oddelek: Programiranje
81123 (950) vojko20
»

Napaka pri povezavi z bazo - c#

Oddelek: Programiranje
71008 (872) Mitja Bonča
»

[Java] Zmešnjava

Oddelek: Programiranje
462069 (1574) ]Fusion[

Več podobnih tem