Avatar
Petr Žitník:

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. května 11:24
 
Odpovědět 9. května 11:23
Avatar
Sony Nguyen
Redaktor
Avatar
Sony Nguyen:

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. května 11:48
 
Nahoru Odpovědět 9. května 11:48
Avatar
Odpovídá na Sony Nguyen
Petr Žitník:

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. května 11:56
Avatar
Sony Nguyen
Redaktor
Avatar
Sony Nguyen:

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

 
Nahoru Odpovědět 9. května 12:19
Avatar
Odpovídá na Sony Nguyen
Petr Žitník:

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. května 12:32
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Petr Žitník
Martin Dráb:

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. května 13:29
2 + 2 = 5 for extremely large values of 2
Avatar
Petr Žitník:

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. května 15:50
Avatar
Petr Žitník:

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. května 16:16
Avatar
B42P6
Člen
Avatar
Odpovídá na Petr Žitník
B42P6:

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

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 9. května 21:53
'long long long' is too long for GCC
Avatar
B42P6
Člen
Avatar
Odpovídá na Sony Nguyen
B42P6:

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. května 22:13
'long long long' is too long for GCC
Avatar
Petr Žitník:

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. května 22:31
Avatar
Petr Žitník:

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. května 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.