Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Ormond 18. 08. 2011, 22:12:56
-
Mám takový drobný problém:
V rodičovské třídě "CEntity" vracím pomocí jedné metody "GetID" objekt, který je třídy potomka "CInt". A já se ptám: jde to, a jak? Díky.
Kód:
lass CInt;//forward declaration
int IDCount=0;//citac entit
class CEntity{
protected:
int ID;
public:
CEntity(){this->ID=IDCount++;}
CInt*GetId(){return new CInt(this->ID);}//toto zlobi
};
class CInt:public CEntity{
protected:
int Value;
public:
CInt(int V){this->Value=V;}
int GetValue(){return this->Value;}
};
Výpis kompileru:
main.cpp: In member function ‘CInt* CEntity::GetId()’:
main.cpp:13: error: invalid use of incomplete type ‘struct CInt’
main.cpp:4: error: forward declaration of ‘struct CInt’
-
Jde to tak, že implementace metody 1. třídy je až po deklaraci 2. třídy:
class CInt;//forward declaration
int IDCount=0;//citac entit
class CEntity{
protected:
int ID;
public:
CEntity() {this->ID=IDCount++;}
// pouze deklarace
CInt*GetId();
};
class CInt:public CEntity{
protected:
int Value;
public:
CInt(int V){this->Value=V;}
int GetValue(){return this->Value;}
};
// a ted i implementace, kdyz jsou metody CInt tridy deklarovany
inline CInt* CEntity::GetId() {return new CInt(this->ID);}
Klíčové slovo inline je nutné při umístění v hlavičkovém souboru.
-
Jde to a velice jednoduše:
lass CInt;//forward declaration
int IDCount=0;//citac entit
class CEntity{
protected:
int ID;
public:
CEntity(){this->ID=IDCount++;}
CInt*GetId();
};
class CInt:public CEntity{
protected:
int Value;
public:
CInt(int V){this->Value=V;}
int GetValue(){return this->Value;}
};
CInt* CEntity::getID()
{
return new CInt(this->ID);
}
-
Díky za rychlou odpověď a vyřešení problému.
-
Z tohoto dů§vodu se v C++ v drtivé většině odděluje implementace metod od definice: definice je v hlavičkovém souboru, implementace v .cpp souboru. Není to povinnost, ale např. to i ušetří čas při kompilaci, ve složitějším projektu s knihovnama to zabrání zbytečné duplikaci metod atd...