dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

Overloadeetas klases Construktors

 
dev.gamez.lv Forum Index -> Programmēšana
View previous topic :: View next topic  
Author Message
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: Sat Apr 08, 2006 10:06 am    Post subject: Overloadeetas klases Construktors

Atkal viena laikam neatrisinaama probleema.Bet tomeer labaak pajautaashu:
Ir 2 klases-viena overloadeejamaa,bet otra klase tiek overloadeeta.

Overloadeejamaa:
Code:

class Pirmaa
{
public:
     Pirmaa(){/*kautkas notiek*/};
     virtual ~Pirmaa(){/*kautkas notiek*/};

     virtual void Funkcija()=0;
};

Otra:
Code:

class Otraa:public Pirmaa
{
public:
     Otraa(){/*kautkas notiek*/};
     virtual ~Otraa(){/*kautkas notiek*/};

     virtual void Funkcija(){/*kautkas notiek*/};
};

Probleema taada, ka vajadzeetu otrajaa klasee izsaukt pirmaas klases Konstruktoru (nezinu vai skaidri izteicos).Tipa:
Code:

Otraa::Otraa()
{
     Pirmaa::Pirmaa();
}

Peec logjikas tas nebutu iespejams (arii kodaa tas nestraadaa), jo Pirmaa klase nevar eksisteet (jo ir viena pure virtual funkcija (Funkcija()),kas reali nemaz neeksistee).
Kaa jau teicu-droshi vien shii ir neatrisinaama probleema,bet varbuut kaadam ir kaadas idejas.

P.P.S. Ja ir, tad atvainojos par kljuudaam kodaa-rakstiju uz aatro,bet domai vajadzeetu buut skaidrai.
_________________
long time; /* know C */
Back to top
View user's profile Visit poster's website
BHC



Joined: 31 Jan 2006
Posts: 81

PostPosted: Sat Apr 08, 2006 10:32 am    Post subject: Re: Overloadeetas klases Construktors

elvman wrote:
Atkal viena laikam neatrisinaama probleema.Bet tomeer labaak pajautaashu:
Ir 2 klases-viena overloadeejamaa,bet otra klase tiek overloadeeta.

Overloadeejamaa:
Code:

class Pirmaa
{
public:
     Pirmaa(){/*kautkas notiek*/};
     virtual ~Pirmaa(){/*kautkas notiek*/};

     virtual void Funkcija()=0;
};

Otra:
Code:

class Otraa:public Pirmaa
{
public:
     Otraa(){/*kautkas notiek*/};
     virtual ~Otraa(){/*kautkas notiek*/};

     virtual void Funkcija(){/*kautkas notiek*/};
};

Probleema taada, ka vajadzeetu otrajaa klasee izsaukt pirmaas klases Konstruktoru (nezinu vai skaidri izteicos).Tipa:
Code:

Otraa::Otraa()
{
     Pirmaa::Pirmaa();
}

Peec logjikas tas nebutu iespejams (arii kodaa tas nestraadaa), jo Pirmaa klase nevar eksisteet (jo ir viena pure virtual funkcija (Funkcija()),kas reali nemaz neeksistee).
Kaa jau teicu-droshi vien shii ir neatrisinaama probleema,bet varbuut kaadam ir kaadas idejas.

P.P.S. Ja ir, tad atvainojos par kljuudaam kodaa-rakstiju uz aatro,bet domai vajadzeetu buut skaidrai.

Neatrisināma problēma, lol?
Tev nekas nav jāizsauc.
Otrā konstruktors automātiski izsauc pirmā konstruktoru.
Respektīvi, sākumā izsaucas pirmā konstruktors un tad otrā.
Ņjāms.

Viss, ko tu izdari ir izveido otrās klases instanci:
Otraa instance; // Izsaucas Pirmais::Pirmais(), tad Otrais::Otrais()

Vēl varu pieminēt, ka terminoloģija nav īsti pareiza. Overloadētā klase? Uh?
_________________
Screenshot coming when hell freezes over.
Back to top
View user's profile
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: Sat Apr 08, 2006 10:39 am    Post subject:

Nop!
Ieliku Pirmaas klases konstrukotraa MessageBox(0,0,0,0); (mans standarta veids kaa kautko paarbaudiit), bet nekaa.Varbuut man tieshaam SHAUSMIIGI liikas rokas,bet tas tak neko nemaina-messageboxim bija jaaparaadaas->taaka konstruktors netika izsaukts.

Paga-es izmantoju new operatoru.Varbuut tur ir vaina?

P.S. Par terminologjiju arii isti nebiju parliecinaats,bet galvenais lai doma skaidra.
_________________
long time; /* know C */
Back to top
View user's profile Visit poster's website
BHC



Joined: 31 Jan 2006
Posts: 81

PostPosted: Sat Apr 08, 2006 10:52 am    Post subject:

elvman wrote:
Nop!
Ieliku Pirmaas klases konstrukotraa MessageBox(0,0,0,0); (mans standarta veids kaa kautko paarbaudiit), bet nekaa.Varbuut man tieshaam SHAUSMIIGI liikas rokas,bet tas tak neko nemaina-messageboxim bija jaaparaadaas->taaka konstruktors netika izsaukts.

Paga-es izmantoju new operatoru.Varbuut tur ir vaina?

P.S. Par terminologjiju arii isti nebiju parliecinaats,bet galvenais lai doma skaidra.

Tas ir vienalga, vai tu izmanto new vai nē. Konstruktori izsaucas tā pat.
_________________
Screenshot coming when hell freezes over.
Back to top
View user's profile
GiGa
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 25 Sep 2003
Posts: 887

PostPosted: Sat Apr 08, 2006 10:58 am    Post subject:

Elvman, neredzu probleemu...
Code:

#include <cstdlib>
#include <iostream>

using namespace std;

class Pirmaa
{
public:
     Pirmaa(){cout << "Pirmaa()" << std::endl;};
     virtual ~Pirmaa(){cout << "~Pirmaa()" << std::endl;};

     virtual void Funkcija()=0;
};

class Otraa:public Pirmaa
{
public:
     Otraa(){cout << "Otraa()" << std::endl;};
     virtual ~Otraa(){cout << "~Otraa()" << std::endl;};

     virtual void Funkcija(){cout << "Funkcija()" << std::endl;};
};

int main(int argc, char *argv[])
{
    Pirmaa *a=new Otraa;
    a->Funkcija();
    delete a;

    {
        Otraa b;
        b.Funkcija();
    }
   
    system("PAUSE");
    return EXIT_SUCCESS;
}

man izdod:
Quote:

Pirmaa()
Otraa()
Funkcija()
~Otraa()
~Pirmaa()
Pirmaa()
Otraa()
Funkcija()
~Otraa()
~Pirmaa()


esi paarliecinaats, ka testee pareizi?
Back to top
View user's profile Send e-mail
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: Sat Apr 08, 2006 11:04 am    Post subject:

Vispar ja.Atceros kad kadreiz taisiju kautkaadu engine tur bija klase CObject un piemeram CSkyBox bija "zem" CObject.Un konstruktors stradaja-visus parametrus salika uz NULL.
BET MAN NESTRADA!
Nu tad meklejam problemu dziljak:
Pirmaa klase tiek eksporteeta no dll:
Code:

class __declspec(dllexport) Pirmaa
{
     ...
};


Otra klase ir otraa dll failaa:
Code:

class Otraa:public Pirmaa
{
     ...
};


un te buus funkcija ar kuru Otrais dll tiek palaists:
Code:

extern "C" void StartPlugin()
{
   new COtraa();
}


Tiek izsaukts Otraas klases konstruktors un viss.
_________________
long time; /* know C */
Back to top
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Sat Apr 08, 2006 11:58 am    Post subject:

Vispār jau abstraktas klases (ar pure virtual funkcijām) konstruktoru izsaukt no mantotas klases drīkst. Nedrīkst instancēt to abstrakto klasei (vai nu stekā, vai heapā).

Un vispār - parenta konstruktoru neizsauc tā kā tu dari. Vajag šādi (aiz kola!)
Code:
Otraa() : Pirmaa() { ... }

Tāpat kā jebkura cita klases membera inicializāciju. Citādi viņi inicializēsies 2 reizes - pirmo reizi automātiski (jo sākoties konstruktora kodam - aiz { - visiem memberiem jābūt inicializētiem), un otro rezi - tad kad tu izsauksi to konstruktorus jeb piešķirsi tiem vērtības.

Defaultos konstruktorus, protams, var neizsaukt.
Man šāds kods:
a.h:
Code:
__declspec(dllexport) class Pirmaa
{
public:
  Pirmaa();
  virtual ~Pirmaa();

  virtual void Funkcija()=0;
};

a.cpp:
Code:
#include <iostream>
#include "a.h"
Pirmaa::Pirmaa() { std::cout << "Pirmaa()" << std::endl; };
Pirmaa::~Pirmaa() { std::cout << "~Pirmaa()" << std::endl; };

b.cpp:
Code:
#include <iostream>
#include "a.h"

class Otraa : public Pirmaa
{
public:
  // nākamajā rindiņā varēja arī izlaist ": Pirmaa()"
  // rezultāts būtu tāds pats
  Otraa() : Pirmaa() { std::cout << "Otraa()" << std::endl; };
  virtual ~Otraa() { std::cout << "~Otraa()" << std::endl; };

  virtual void Funkcija() {};
};

int main(void)
{
  Otraa* o = new Otraa();
  delete o;
  return 0;
}

Izveidoja a.dll un b.exe failus. Palaižot to visu:
Code:
C:\>g++ -mdll -Wl,--out-implib -Wl,liba.a a.cpp -o a.dll
Creating library file: liba.a

C:\>g++ b.cpp liba.a -o b.exe

C:\>b.exe
Pirmaa()
Otraa()
~Otraa()
~Pirmaa()
Back to top
View user's profile Send e-mail
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: Sat Apr 08, 2006 12:13 pm    Post subject:

Paldies!Vot tieshi tas arii bija tas ko man vajadzeeja!
_________________
long time; /* know C */
Back to top
View user's profile Visit poster's website
Display posts from previous:   
dev.gamez.lv Forum Index -> Programmēšana All times are GMT + 2 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group