NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: C++ WxWidgets "undefined reference error" Pomoc prosím

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Petr Žitník:9.5.2016 11:23

Zdravím, dělám školní projekt do předmětu v rámci vysokoškolského studia. Jelikož je to můj první semestr s c a c++ tak se mi bohužel vyskytl problém s kterým si nevím rady. Zkoušel jsem hledat různě po internetu, stejně tak jsem využil anglické forum StackOverflow, ale bez uspěchu.

Co se tyče problému, jedná se o textovovu adventuru, psanou v c++ jako konzolová aplikace, do té doby šlo všechno v pořadku, jenže v projektu je bohužel podmínka použiti WxWidgets a vytvoření tak GUI pro danou aplikaci. A zde začali byt problemy kdy se mi nedaři připojit GUI k mému puvodnímu programu. Snažím se použit wxTextCtrl aby se mi text vypisoval do okna a stejně tak já mohl v druhém okně vpisovat přikazy.

Ted k samotnému kodu.

void WxWFrame::moveObject(const char *noun, OBJECT *from, OBJECT *to)
{
   OBJECT *obj = parseObject(noun);
   if (obj == NULL)
   {
    vystup->AppendText("I don't understand what item you mean.\n");
   }

"vystup" je součastí class wxTextCtrl a je definovaná v WxWMain.h asi takhle:

//(*Declarations(WxWFrame)
       static wxTextCtrl* vystup;
       wxStatusBar* StatusBar1;
       wxTextCtrl* TextCtrl2;
       //*)

Bohužel mi to stale vyhazuje tento error :

C:\Users\Petr2\Desktop\Programko\TextovkaWxW\inventar.cpp|12|undefined reference to `WxWFrame::vystup'|

A já netuším, jak mám dosahnout spravne definice, aby to fungovalo.
Předem děkuji za pomoc,
Petr Žitník

Editováno 9.5.2016 11:24
 
Odpovědět
9.5.2016 11:23
Avatar
Sony Nguyen
Tvůrce
Avatar
Sony Nguyen:9.5.2016 11:48

Ahoj, myslím, že by to mohlo být tím, že výstup je statický člen, ale v moveObject k tomu přistupuješ jakoby nebyl statický. Zku oddělat static v hlavičkovém souboru nebo v implementaci zkus

void WxWFrame::moveObject(const char *noun, OBJECT *from, OBJECT *to)
{
   OBJECT *obj = parseObject(noun);
   if (obj == NULL)
   {
    WxWFrame::vystup->AppendText("I don't understand what item you mean.\n");
   }

snad pomohlo :)

Editováno 9.5.2016 11:48
 
Nahoru Odpovědět
9.5.2016 11:48
Avatar
Odpovídá na Sony Nguyen
Petr Žitník:9.5.2016 11:56

Něco podobného mě už napadlo, bohužel, to vyhodí tuhle chybovou hlášku:

C:\Users\Petr2\Desktop\Programko\TextovkaWxW\WxWMain.h|89|error: invalid use of member 'WxWFrame::vystup' in static member function|
C:\Users\Petr2\Desktop\Programko\TextovkaWxW\inventar.cpp|12|error: from this location|

Ukazuje to na řádek 12, což je:

WxWFrame::vystup->AppendText("I don't understand what item you mean.\n");
 
Nahoru Odpovědět
9.5.2016 11:56
Avatar
Sony Nguyen
Tvůrce
Avatar
Sony Nguyen:9.5.2016 12:19

A musí být výstup statický? :)

 
Nahoru Odpovědět
9.5.2016 12:19
Avatar
Odpovídá na Sony Nguyen
Petr Žitník:9.5.2016 12:32

No...já definoval všechny mé funkce z konzolové časti programu do WxWMain.h do public části, všechny jsem je udělal static, protože jinak to hlasilo, že funkce není "static member of class WxWFrame"

class WxWFrame: public wxFrame
{
    public:

        WxWFrame(wxWindow* parent,wxWindowID id = -1);
        virtual ~WxWFrame();


        static int getInput();
        static char input[100];
        static int parseAndExecute();
        static void moveObject(const char *noun, OBJECT *from, OBJECT *to);
        static void executeLook(const char *noun);
        static void executeGo(const char *noun);
        static void executeGet(const char *noun);
        static void executeDrop(const char *noun);
        static void executeGive(const char *noun);
        static void executeAsk(const char *noun);
        static void executeInventory(void);
        static int nounIsInTags(const char *noun, const char **tags);
        static int listObjectsAtLocation(OBJECT *location);
        static int main();

    private:

        //(*Handlers(WxWFrame)
        void OnQuit(wxCommandEvent& event);
        void OnAbout(wxCommandEvent& event);
        void OnTextCtrl1Text(wxCommandEvent& event);
        void OnTextCtrl2Text(wxCommandEvent& event);
        void OnTextCtrl1Text1(wxCommandEvent& event);
        //*)

        //(*Identifiers(WxWFrame)
        static const long ID_TEXTCTRL1;
        static const long ID_TEXTCTRL2;
        static const long idMenuQuit;
        static const long idMenuAbout;
        static const long ID_STATUSBAR1;
        //*)

        //(*Declarations(WxWFrame)
        wxTextCtrl* vystup;
        wxStatusBar* StatusBar1;
        wxTextCtrl* TextCtrl2;
        //*)

        DECLARE_EVENT_TABLE()
};

tohle je vlastně celé, co se nachází v WxWMain.h

 
Nahoru Odpovědět
9.5.2016 12:32
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Petr Žitník
Martin Dráb:9.5.2016 13:29

Pozor na to, že ze statické funkce se nedostaneš na nestatické atributy a metody dané třídy. Z toho, co tu píšeš, moc nevidím, proč ty věci musí být statické. Maximálně proto, že je používáš přes

WxWFrame::funkce

což je málokdy opravdu potřeba.

Pokud by byl vystup nestatický, tak bych zkusil přistupovat přes

this->vystup

ale takhle nevím. Možná by pomohlo sem dát více zdrojáku, nebo i celý projekt v aktuálním stavu. Takhle asi budeme jen hádat.

Nahoru Odpovědět
9.5.2016 13:29
2 + 2 = 5 for extremely large values of 2
Avatar
Petr Žitník:9.5.2016 15:50

Pokusím se sem přidat celý zdroják...mam ho rozdělený na více částí, pracoval jsem podle jednoho tutorialu a nasledně se pokusil vlastníma silama to spojit s WxWidgets, bohužel se nepovedlo...takže, snad to sem nějak dokažu dát celé.

 
Nahoru Odpovědět
9.5.2016 15:50
Avatar
Petr Žitník:9.5.2016 16:16

Tohle by měli byt všechny časti projetku, snad to pujde.
http://www.itnetwork.cz/dev-lighter
snad se k tomu pujde dostat, nejsem si jistej jak jinak to se mam přidat všechno.

 
Nahoru Odpovědět
9.5.2016 16:16
Avatar
B42P6
Člen
Avatar
Odpovídá na Petr Žitník
B42P6:9.5.2016 21:53

Ahoj, tvoj problém má už riešenie tu: http://www.itnetwork.cz/…72cb552b7980

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
9.5.2016 21:53
'long long long' is too long for GCC
Avatar
B42P6
Člen
Avatar
Odpovídá na Sony Nguyen
B42P6:9.5.2016 22:13

Ahoj, k statickým atribútom sa dá pristupovať aj ako keby neboli statické :):

struct A
{
        static string text; //Len deklaracia

        void print()
        {

                //Do statickych atributov sa da pristupovat cez this
                cout << this->text << endl;
                //A aj bez this
                cout << text << endl;
        }
};

string A::text("RandomText"); //Definicia, to co chybalo

int main()
{
        A a;

        a.print();

        //Do statickych atributov sa da pristupovat aj priamo cez instanciu
        cout << a.text << endl;
}

Prečo inak by bolo toto zakázané

struct B
{
        void f(){}

        static void f(){} //Error
        //Ako by compiler zistil ci chces volat staticku alebo nestaticku?
};
Nahoru Odpovědět
9.5.2016 22:13
'long long long' is too long for GCC
Avatar
Petr Žitník:9.5.2016 22:31

Dobře, pokusím se to nějak aplikovat na svůj problém, snad se mi to povede správně.

 
Nahoru Odpovědět
9.5.2016 22:31
Avatar
Petr Žitník:10.5.2016 11:01

No, problem asi bude v tom, že já netuším jak a kam to přesně do kódu mam aplikovat...To už je z mé strany hloupá otázka, jenom jsem z toho všeho tak trochu zmatenej.

 
Nahoru Odpovědět
10.5.2016 11:01
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.