View previous topic :: View next topic |
Author |
Message |
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: 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 |
|
|
BHC
Joined: 31 Jan 2006 Posts: 81
|
Posted: 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 |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: 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 |
|
|
BHC
Joined: 31 Jan 2006 Posts: 81
|
Posted: 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 |
|
|
GiGa Indago Uzvarētājs
Joined: 25 Sep 2003 Posts: 887
|
Posted: 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 |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: 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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: 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 |
|
|
|