C++, třídy a cyklická závislost

Ormond

C++, třídy a cyklická závislost
« kdy: 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:

Kód: [Vybrat]
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’
« Poslední změna: 18. 08. 2011, 22:29:11 od Petr Krčmář »


Jiří Michalec

Re: C++, třídy, cyklická závislost, forward declaration
« Odpověď #1 kdy: 18. 08. 2011, 22:37:28 »
Jde to tak, že implementace metody 1. třídy je až po deklaraci 2. třídy:
Kód: [Vybrat]
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.

Sten

Re: C++, třídy a cyklická závislost
« Odpověď #2 kdy: 18. 08. 2011, 22:38:03 »
Jde to a velice jednoduše:
Kód: [Vybrat]
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);
}

Ormond

Re: C++, třídy a cyklická závislost
« Odpověď #3 kdy: 18. 08. 2011, 22:48:14 »
Díky za rychlou odpověď a vyřešení problému.

Logik

  • *****
  • 1 031
    • Zobrazit profil
    • E-mail
Re: C++, třídy a cyklická závislost
« Odpověď #4 kdy: 18. 08. 2011, 23:53:54 »
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...