[ vilyu @ 15.09.2005. 09:56 ] @
Zdravo,

Pisem neku klasu i u zelji da moj kod bude dobro organizovan, odlucio sam da je odvojim od koda sa main funkcijom. Prebacio sam je u drugi cpp fajl, inkludovao ga, a onda je kompajler poceo da prijavljuje: multiple definition of member function za konstruktor moje klase koji je definisan izvan tela klase, a u istom fajlu gde i klasa.

Pretrazio sam Google i ES i ustanovio da je resenje da definicije (interfejs klase) izdvojim u adekvatne header fajlove, koje bih ogradio pretprocesorskim direktivama da se ne ucitavaju vise puta, a da implementaciju stavim u cpp fajlove. E sad, obicno su se tu zavrsavali svi komentari koje sam nasao na Google-u i ES-u, jer su se u tom momentu postavljaci pitanja zahvaljivali na odgovoru i sve im je radilo.

Meni sada kompajler prijavljuje:
- Kad u header stavim samo
Code:
class MojaKlasa;
variable MojaKlasa Objekat has initializer but incomplete type
- Kad (u header) stavim
Code:
class MojaKlasa : public Window {};
dobijem: expected class-name before "{" token
- Kad u konstruktoru klase ostavim u listi inicijalizacija poziv konstruktora roditeljske klase, onda kaze da u klasi nemam datog polja (s imenom pozvanog konstruktora)
- OK, sad i to izbacim iz deklaracije, ostaje naveden konstruktor sa navedenim tipovima argumenata koje dobija. Kao novu gresku, kompajler za implementaciju konstruktora prijavljuje da redefinisem prethodno definisanu f-ju
- I tako jos neki pokusaji, ali nista nisu urodili plodom

Dakle: Kako se pravilno stavljaju klase u druge fajlove?

Hvala!
[ leka @ 15.09.2005. 10:24 ] @
Nepisano pravilo (ne mora ali je tako najpreglednije/najbolje) je da odvojis deklaracije u header fajl (.h ili .hh ili .hpp), a da definicije funkcija (metoda) stavis u cisti sors fajl (.cc, .cpp ili recimo .cxx).

Prost primer, fajl MojaKlasa.h
Code:

class MojaKlasa
{
  int _value;
  public:
    MojaKlasa(); // konstruktor
    ~MojaKlasa(); // destruktor
    void Value(int arg); // javni metod
    int Value(); // drugi javni metod
};

dok bi MojaKlasa.cpp izgledao ovako:
Code:

#include "MojaKlasa.h"

MojaKlasa::MojaKlasa()
{
  _value = 5;
}

int MojaKlasa::Value()
{
  return _value;
}

void MojaKlasa::Value(int arg)
{
  _value = arg;
}