Avatar billede rrm Nybegynder
03. januar 2006 - 10:44 Der er 15 kommentarer og
1 løsning

Kopier objecter

Jeg er gået lidt fast i hvordan man nemmest kopier et object??

Hvis jeg f.eks. har et object af typen wxMenu kaldet t, har jeg forsøgt med

  wxMenu f(t);

Er dette ikke rigtigt?? Jeg får den fejl at error C2248: 'wxMenu::wxMenu' : cannot access private member declared in class 'wxMenu'

Og hvordan foregår det når man skal kopier det som pointers peger på?? Lave specielle konstructorer til det eller?
Avatar billede lars314 Nybegynder
03. januar 2006 - 13:30 #1
Den der har lavet wxMenu har med vilje gjort det sådan at du ikke kan bruge copy contructoren. Det kan der være mange gode grunde til som jeg ikke kender.

Du kan kopiere det som en pointer peger på ved at kalde copy-constructoren med den dereferencered pointer. Det vil sige

Aclass b;
AClassPtr p = &b;

AClass a(*p);
Avatar billede rrm Nybegynder
03. januar 2006 - 14:14 #2
Ok, jeg har prøvet med:

wxMenu trackPopup;
wxMenu* tmp = &trackPopup;
wxMenu tmp1(*tmp);

men jeg får stadig fejlen "error C2248: 'wxMenu::wxMenu' : cannot access private "member declared in class 'wxMenu'
Avatar billede lars314 Nybegynder
03. januar 2006 - 14:36 #3
Ja du får stadig fejlen, fordi at du ikke kan bruge copy-constructoren i wxMenu. Det er ikke tilladt. Du må finde en anden måde at kopiere den menu på.
Havde du haft adgang til copy-constructoren, så havde det virket.
Avatar billede rrm Nybegynder
03. januar 2006 - 14:44 #4
nå, misforstod vist lige dit svar... Har du nogle gode forslag på hvordan det kan gøres??
Avatar billede lars314 Nybegynder
03. januar 2006 - 15:08 #5
Nej desværrer.
Jeg kender intet til wxWindows.
Avatar billede bertelbrander Novice
03. januar 2006 - 19:46 #6
Det giver ikke rigtigt mening at kopiere en menu, derfor har wxWindows sørget for at du ikke kan, ved at gøre copy-constructoren og assignment operatoren private.

For at finde en løsning bliver vi nødt til at vide hvad det er du vil.
Avatar billede rrm Nybegynder
03. januar 2006 - 22:16 #7
Grunden hertil er at jeg får en heap fejl og jeg troede at det var den måde jeg oprettet koden på der forudsagede det, men nu tror jeg ikke at det var den, men jeg har ikke fundet fejlen
Avatar billede bertelbrander Novice
04. januar 2006 - 00:09 #8
Måske skulle du poste noget kode.
Avatar billede rrm Nybegynder
05. januar 2006 - 15:14 #9
ok, men det er en del:

Først kommer det der skal slettes:

wxTrack::wxTrack( int GUITrackId, wxWindow* parent, wxWindowID id,
            const wxPoint& pos, const wxSize& size,
            long style, const wxString& name) :
            wxWindow(parent, id, pos, size, style, name),
            wxTrackID(GUITrackId), trackID(0), ownerWindow(parent), wxBase() {

    // Save the window arguments
    win = new windowStruct;
    COPY_WINDOW_STRUCT_P(win)
    createGUI();
}

wxTrack::~wxTrack() {
    delete trackPopup;
    delete win;   
}

void wxTrack::createGUI() {
createPopupMenu(ENUM_TRACK, trackPopup);
enableMenuItems(ENUM_TRACK, trackPopup);
}

Her modtager et event fra en popup menu
void wxTrack::handleEvent(wxCommandEvent& evt) {

    switch(evt.GetId()) {
        case mnuPopUpDeleteTrack:
            DOLOG << "Deleting " << wxTrackID << endl;
            evt.SetInt(wxTrackID);
            evt.Skip(); // sender evenen til næste event handler (wxTracksPanel)
            break;
    }
}

Her modtages event'en

void wxTracksPanel::handleEvent(wxCommandEvent& evt) {

    int id = 0;

    switch(evt.GetId()) {
...
        case mnuPopUpDeleteTrack:
            id = evt.GetInt();
            DOLOG << "Got " << id << endl;
            deleteTrack(id);
            break;
    }
}

og her slettes den

void wxTracksPanel::deleteTrack(int id) {

    // TODO fix that occur when deleting a track

    vector<wxTrack*>::iterator tIter = tracks.begin(); // tracks er en vector

    while(tIter != tracks.end())
    {
        int t = (*tIter)->getId(); // henter dens id ud
        if(t == id)
        {
            (*tIter)->removeSelection();
            tracksSizer->Remove((*tIter));
            delete *tIter;
            tracks.erase(tIter);
            break;
        }

        tIter++;
    }

    tracksSizer->Layout();
}

Nogen der kan spotte hvad der er galt???

Den giver følgende fejl:
HEAP[MuSeq.exe]: HEAP: Free Heap block e95418 modified at e95738 after it was freed
Windows has triggered a breakpoint in MuSeq.exe.

This may be due to a corruption of the heap, and indicates a bug in MuSeq.exe or any of the DLLs it has loaded.

The output window may have more diagnostic information
The program '[756] MuSeq.exe: Native' has exited with code 0 (0x0).
Avatar billede rrm Nybegynder
05. januar 2006 - 15:20 #10
og createPopupMenu(ENUM_TRACK, trackPopup); er givet ved:

bool createPopupMenu(MENU_TYPE menuType, wxMenu* &trackPopup) {

    trackPopup = new wxMenu();

    if(trackPopup == NULL)
        return false;

    if(menuType == ENUM_TRACK || menuType == ENUM_CLIP ||
            menuType == ENUM_CLIPOVERVIEW || menuType == ENUM_CLIP_CREATED)
    {
        trackPopup->Append(mnuPopUpCreateTrack, "Create Track");
        trackPopup->Append(mnuPopUpDeleteTrack, "Delete Track");
    }
}
Avatar billede rrm Nybegynder
05. januar 2006 - 15:21 #11
der kommer ingen fejl, når jeg ikke forsøger at slette trackPopup i ~wxTrack.
Avatar billede bertelbrander Novice
05. januar 2006 - 20:17 #12
På denne side:
http://www.wxwidgets.org/manuals/2.4.2/wx262.htm

står der:
"All menus except the popup ones must be created on the heap. All menus attached to menubar or to another menu will be deleted by their parent when it is deleted. As the frame menubar is deleted by the frame itself, it means that normally all menus used are deleted automatically."

Jeg kan ikke umiddelbart se at der er noget galt med din kode, men du skal måske slet ikke slette menu'en igen?
Avatar billede rrm Nybegynder
06. januar 2006 - 12:47 #13
Tak for hjælpen begge to. Havde ikke lige set den bemærkning på dokumentations siden. Men vi har du fået det til at virke.... Ligger i et svar???
Avatar billede bertelbrander Novice
07. januar 2006 - 00:26 #14
Jeg samler ikke på point.
Avatar billede lars314 Nybegynder
08. januar 2006 - 00:19 #15
Bertel er den der hjalp dig mest, så når han ikke vil have pointene, så tag dem bare selv tilbage igen.
Avatar billede rrm Nybegynder
08. januar 2006 - 20:22 #16
ok så..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB