» Poradna » Programy

Volani tridy ze tridy - nefunguje. Proc?

 |   | 

Ahoj, jsem z toho uz uplne magor...
Ma zalozenou tridu:
class WXFoxServer: public WXCrystObjBasic
{
public:
WXFoxServer(wxWindow* parent);
~WXFoxServer();
void OnServerEvent(wxSocketEvent &event);
}

a z funkce "OnServerEvent(wxSocketEvent &event)" volam funkci:"UpdateClientsWindow()" ze tridy:
class WXCrystMainFrame : public wxFrame
{
public:
WXCrystMainFrame(const wxString& title, const wxPoint& pos, const wxSize& size,
const bool splashscreen=true);
.
.
.
.
void UpdateClientsWindow();//je opravdu public!!!
};

delam to takto: WXCrystMainFrame::UpdateClientsWindow();// a compilator rve: "illegal call of non-static member function"
nebo takto:

WXCrystMainFrame *pokus = new WXCrystMainFrame;// a compilator rve:no appropriate default constructor available
pokus->UpdateClientsWindow();

Jak to mam vyresit? Jako "static" ji dat nemuzu - uz jsem to zkousel a zase to dela blosti jiny.

Odpovědi na otázku

 |   | 

Tak jsem to uz vyresil tim, ze jsem si zalozil vlastni tridu a cele to ovladam z toho.
...ale stejne nevim, proc to takhle nefunguje. Ted pouzivam stejnou syntaxi (v te me tride) a funguje to...
Jsem z toho jelen...

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

A čemu konkrétně nerozumíš na té chybové hlášce? Každá normální metoda v C++ potřebuje znát "this" a to při zavolání

WXCrystMainFrame::UpdateClientsWindow();

jaksi nedostane. Kdybys ale napsal

this->UpdateClientsWindow();

pojede Ti to jako z praku.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

s tim this to nejede...
error C2039: 'UpdateClientsWindow' : is not a member of 'WXFoxServer'
..."this" v tomto pripade ukazuje na tridu "WXFoxServer".
No, nevadi, jak jsem rikal: uz jsem to obesel jinak...

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Jestliže uvnitř metody jedné třídy chci zavolat metodu jiné třídy (to je mimochodem přesně to co pisatel žádá) a použiji k tomu obrat this->NázevMetody pak výsledkem Tvé rady bude ovšem hlášení "is not a member of 'názevdruhétřídy'. Nikoli tedy to co píšeš "pojede Ti to jako z praku". Průměrně inteligentní překladač to odmítne přeložit a tudíž ani nevygeneruje spustitelný soubor - tudíž, nejen že to nepojede jako z praku, ono to nepojede ani nijak jinak (není co by jelo)!!!
C++ je velmi elegantní jazyk, žel vyžaduje po nás jeho znalost.:)

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Aha, já jsem včera k večeru nevímproč pochopil, že to chce Honza volat v té samé třídě - resp. v instanci té samé třídy (asi proto, že se titulek jmenuje "volání třídy ze třídy"). Lamu ze mě dělat nemusíš, programováním v C++ jsem se živil cca 7 let.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Lamu z nikoho zásadně nedělám (také jsme se učil a učím), někdy (často) jsem ale mimoděk (záměrně) sarkastický (zejména když mám nahráno na smeč). Sorry.:)))

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

1. Zápisem WXCrystMainFrame::UpdateClientsWindow(); v podstatě říkáš překladači, že má zavolat statickou funkci UpdateClientsWindow ve třídě WXCrystMainFrame - což není tvůj případ a tak překladač správně řve! Poněvadž funkci UpdateClientsWindow nechceš mít statickou - nelze tento způsob pro volání metody použít.
2. V dalším odstavci jsi správně vycítil že potřebuješ zavolat metodu UpdateClientsWindow v nějaké již vytvořené instanci třídy WXCrystMainFrame. Metoda new zde může pomoci, ale...
- ve třídě WXCrystMainFrame máš deklarovaný konstruktor WXCrystMainFrame(const wxString &title, const wxPoint& pos, const wxSize& size, const bool splashscreen=true); !!! a po operátoru new vyžaduješ vyrobit instanci pomocí konstruktoru bez parametrů. To je ten default který překladač nemůže nalézt - no appropriate default constructor. A nemůže jej nalézt z prostého důvodu. Tím, že sis specifikoval svůj konstruktor s parametry, překladač automaticky negeneruje default konstruktor bez parametrů (což obvykle učiní pokud žádný konstruktor neuvedeš). Pomoc v tomto případě je prostá, jednoduchá a elegantní: deklaruj si explicitně default konstruktor zápisem do třídy asi takto:
public:
WXCrystMainFrame() {} // v těle bych inicializoval nějak promenné třídy
a je to.
Nebo operatoru new předhoď svůj konstruktor jak sis jej vymyslel:
new WXCrystMainFrame( title, pos, size, splashscreen );
C++ je velmi elegantní jazyk, žel vyžaduje po nás jeho znalost.:)

Souhlasím  |  Nesouhlasím  |  Odpovědět

Související témata: Public, Void, Event




Určitě si přečtěte

Roboruka se 100 let učila otočit kostičku. Skutečné A.I. se možná nikdy nedočkáme

Roboruka se 100 let učila otočit kostičku. Skutečné A.I. se možná nikdy nedočkáme

** Strojové učení v posledních deseti letech dokázalo divy ** Používáme ho dnes každý den nejen ve vyhledávači ** A přesto se člověku nepřibližuje ani náznakem

Jakub Čížek | 59

Dell XPS 13: Když vás ostatní doženou až za tři roky

Dell XPS 13: Když vás ostatní doženou až za tři roky

** XPS 13 nastartoval trend notebooků bez rámečků ** Letošní model kompletně přechází na USB-C ** Navzdory malému tělu se řadí výkon ke špičce

Tomáš Holčík | 34

PortraitPro: Vyzkoušeli jsme program, který prý udělá z každé „žáby“ krasavici

PortraitPro: Vyzkoušeli jsme program, který prý udělá z každé „žáby“ krasavici

** V digitálním světě nemůžete věřit všemu ** Nová generace 3D fotoeditorů zvládne divy ** Vyzkoušeli jsme PortraitPro, který vám změní i kontaktní čočky

Jakub Čížek | 10

Američtí mariňáci si tisknou kasárna z betonu na 3D tiskárně

Američtí mariňáci si tisknou kasárna z betonu na 3D tiskárně

** Americká námořní pěchota nedávno představila 3D tištěná kasárna pro vojáky ** Ty jim tiskne velká 3D tiskárna na beton ** Výsledkem je solidní obytný prostor, který je slušně chráněný před nepřátelskou palbou

Stanislav Mihulka | 18

Pojďme programovat elektroniku: Jak vlastně funguje akcelerometr a gyroskop nejen ve vašem telefonu

Pojďme programovat elektroniku: Jak vlastně funguje akcelerometr a gyroskop nejen ve vašem telefonu

** Každý současný vybavený mobil má akcelerometr a gyroskop ** Jenže co každé z těchto čidel vlastně dělá a jak vypadá? ** Dnes si to vysvětlíme a do hry zapojíme i Airbus A380 a Arduino

Jakub Čížek | 11


Aktuální číslo časopisu Computer

Jak vytvořit a spravovat vlastní web

Velký test herních klávesnic a DVB-T2 tunerů

Vše o formátu RAW

Vybíráme nejlepší základní desku