Seite 1 von 2

es kann kein Objekt des abstrakten Typs belegt werden

Verfasst: Sa Jun 23, 2012 11:36 am
von Kmitska
Hallo Leute,

mein Compiler spuckt so einen Fehler aus:
es kann kein Objekt des abstrakten Typs »wxGridCellEditor« belegt werden
Kann mir jemand sagen, wie wxGridCellEditor verwenden kann?

Ich verwende es im Moment so:
void listWindow::addToGrid( wxString link ){
...
wxGridCellEditor* cell = new wxGridCellEditor();
gridList->SetCellEditor(0,1, cell);
...
}

Und die ganzen Fehlermeldungen sind hier:
/home/yasin/Programming/C++/Projects/VehClient/listWindow.cpp|276|Fehler: es kann kein Objekt des abstrakten Typs »wxGridCellEditor« belegt werden|
/usr/include/wx-2.8/wx/generic/grid.h|290|Anmerkung: denn die folgenden virtuellen Funktionen sind rein innerhalb »wxGridCellEditor«:|
/usr/include/wx-2.8/wx/generic/grid.h|303|Anmerkung: virtual void wxGridCellEditor::Create(wxWindow*, wxWindowID, wxEvtHandler*)|
/usr/include/wx-2.8/wx/generic/grid.h|320|Anmerkung: virtual void wxGridCellEditor::BeginEdit(int, int, wxGrid*)|
/usr/include/wx-2.8/wx/generic/grid.h|324|Anmerkung: virtual bool wxGridCellEditor::EndEdit(int, int, wxGrid*)|
/usr/include/wx-2.8/wx/generic/grid.h|327|Anmerkung: virtual void wxGridCellEditor::Reset()|
/usr/include/wx-2.8/wx/generic/grid.h|355|Anmerkung: virtual wxGridCellEditor* wxGridCellEditor::Clone() const|
/usr/include/wx-2.8/wx/generic/grid.h|358|Anmerkung: virtual wxString wxGridCellEditor::GetValue() const|
||=== Build finished: 8 errors, 0 warnings ===|
Danke im Voraus.

Re: es kann kein Objekt des abstrakten Typs belegt werden

Verfasst: Sa Jun 23, 2012 11:59 am
von cloidnerux
Hallo Leute,

mein Compiler spuckt so einen Fehler aus:
es kann kein Objekt des abstrakten Typs »wxGridCellEditor« belegt werden
Kann mir jemand sagen, wie wxGridCellEditor verwenden kann?
Es handelt sich anscheinend bei "wxGridCellEditor" um eine Abstrakte Klasse, also eine Klasse die du nicht Instanzieren kannst. Folglich brauchst du eine Klasse, die von wxGridCellEditor erbt oder du musst dir selber eine schreiben, die das macht.
Da ich mich mit wxWidgets nicht auskenne, weiß ich nicht, was der "editor" machen soll und ob es da schon irgendetwas fertiges gibt.

Re: es kann kein Objekt des abstrakten Typs belegt werden

Verfasst: Sa Jun 23, 2012 1:15 pm
von Kmitska
Also, hier ist nochmal die Doku.-Seite: http://docs.wxwidgets.org/stable/wx_wxg ... celleditor

Heißt das jetzt, dass ich eine Klasse ableiten soll, und wenn ja wie würde sowas damit aussehen?

Was ich gemacht habe:
class test : public wxGridCellEditor
{
public:
test();
~test();
};
Und bei den Fehler war ja so ein Teil dabei:
/usr/include/wx-2.8/wx/generic/grid.h|303|Anmerkung: virtual void wxGridCellEditor::Create(wxWindow*, wxWindowID, wxEvtHandler*)|
/usr/include/wx-2.8/wx/generic/grid.h|320|Anmerkung: virtual void wxGridCellEditor::BeginEdit(int, int, wxGrid*)|
/usr/include/wx-2.8/wx/generic/grid.h|324|Anmerkung: virtual bool wxGridCellEditor::EndEdit(int, int, wxGrid*)|
/usr/include/wx-2.8/wx/generic/grid.h|327|Anmerkung: virtual void wxGridCellEditor::Reset()|
Muss ich jetzt also die Methoden nochmal definieren?

Re: es kann kein Objekt des abstrakten Typs belegt werden

Verfasst: Sa Jun 23, 2012 1:32 pm
von fat-lobyte
Ja, das ist das Prinzip von wxWidgets. Du leitest eine bereits vorhandene Klasse ab, und Überschreibst bestimmte Methoden, um auf Ereignisse zu reagieren wie du es wünscht.

Sieh dir mal diese Seite an: http://docs.wxwidgets.org/trunk/classwx ... ub-methods

Dort stehen alle methoden, die du Überschreiben musst mit "virtual" am Anfang und "= 0" am Ende.

Re: es kann kein Objekt des abstrakten Typs belegt werden

Verfasst: Sa Jun 23, 2012 1:37 pm
von hofian
@Kmitska: ...oder du schaust in der Doku in die "See also" Sektion und benutzt eine bereits vorhandene wxGridCellEditor-Implementierung deiner Wahl.

Re: es kann kein Objekt des abstrakten Typs belegt werden

Verfasst: Sa Jun 23, 2012 6:33 pm
von Kmitska
Emm... ok...

Habe nun dies ausprobiert:

Code: Alles auswählen

class gridCell : public wxGridCellEditor
{
    public:
        gridCell();
        ~gridCell();
        void Create (wxWindow *parent, wxWindowID id, wxEvtHandler *evtHandler);
        void ApplyEdit (int row, int col, wxGrid *grid);
};
Doch ich bekomme immernoch den gleichen Fehler...

Re: es kann kein Objekt des abstrakten Typs belegt werden

Verfasst: Sa Jun 23, 2012 6:40 pm
von Xin
Und hast Du die Create-Funktion dann auch im C++ File implementiert und das C++ File dann mitkompiliert?

Re: es kann kein Objekt des abstrakten Typs belegt werden

Verfasst: Sa Jun 23, 2012 6:46 pm
von Kmitska
Alsoo, hier mal die Source:

.h-Datei:

Code: Alles auswählen

#ifndef WXGRIDCELL_H_INCLUDED
#define WXGRIDCELL_H_INCLUDED

#include <wx/wx.h>
#include <wx/grid.h>

class gridCell : public wxGridCellEditor
{
    public:
        gridCell();
        ~gridCell();
        void Create (wxWindow *parent, wxWindowID id, wxEvtHandler *evtHandler);
        void ApplyEdit (int row, int col, wxGrid *grid);
};

#endif // WXGRIDCELL_H_INCLUDED
.cpp-Datei:

Code: Alles auswählen

#include "wxGridCell.h"

gridCell::gridCell(){

}

gridCell::~gridCell(){
}

void gridCell::Create (wxWindow *parent, wxWindowID id, wxEvtHandler *evtHandler)
{

}

void gridCell::ApplyEdit (int row, int col, wxGrid *grid)
{

}
Fehler:

Code: Alles auswählen

/home/yasin/Programming/C++/Projects/VehClient/listWindow.cpp|281|Fehler: es kann kein Objekt des abstrakten Typs »gridCell« belegt werden|
/home/yasin/Programming/C++/Projects/VehClient/wxGridCell.h|7|Anmerkung:   denn die folgenden virtuellen Funktionen sind rein innerhalb »gridCell«:|
/usr/include/wx-2.8/wx/generic/grid.h|320|Anmerkung: 	virtual void wxGridCellEditor::BeginEdit(int, int, wxGrid*)|
/usr/include/wx-2.8/wx/generic/grid.h|324|Anmerkung: 	virtual bool wxGridCellEditor::EndEdit(int, int, wxGrid*)|
/usr/include/wx-2.8/wx/generic/grid.h|327|Anmerkung: 	virtual void wxGridCellEditor::Reset()|
/usr/include/wx-2.8/wx/generic/grid.h|355|Anmerkung: 	virtual wxGridCellEditor* wxGridCellEditor::Clone() const|
/usr/include/wx-2.8/wx/generic/grid.h|358|Anmerkung: 	virtual wxString wxGridCellEditor::GetValue() const|
/home/yasin/Programming/C++/Projects/VehClient/listWindow.cpp|281|Warnung: Variable »cell« wird nicht verwendet [-Wunused-variable]|
||=== Build finished: 8 errors, 0 warnings ===|

Re: es kann kein Objekt des abstrakten Typs belegt werden

Verfasst: Sa Jun 23, 2012 6:51 pm
von Kmitska
Es hat sich geklärt, ich musst alle diese Funktionen übernehmen. :)

Re: es kann kein Objekt des abstrakten Typs belegt werden

Verfasst: Sa Jun 23, 2012 7:05 pm
von Kmitska
Hier noch ein Problem:

Code: Alles auswählen

gridCell* cell = new gridCell();
cell.Create(this, wxID_ANY, NULL);
Nachdem ich das tippe, bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

/home/yasin/Programming/C++/Projects/VehClient/listWindow.cpp|282|Fehler: Abfrage des Elementes »Create« in »cell«, das vom Nicht-Klassentyp »gridCell*« ist|
||=== Build finished: 1 errors, 0 warnings ===|
Aber ich hab doch das definiert...