Forum: PC-Programmierung C++ Vererbungs Probleme (wxWidgets)


von Peter (Gast)


Lesenswert?

Hallo,
ich habe da ein Problem.
Meine C++ Kenntnisse reichen da leider nicht aus,
auch wenn der eine oder andere sagen wird "das ist doch Basiswissen".
Bitte trotzdem helfen.

Ich habe ein wxWidgets Programm das soll eine Klasse aufrufen die 
wiederum einen eigenen Dialog aufrufen soll.

Die Klassen sehen ungefähr so aus:

class Main: public wxFrame
class test
class testdialog:public wxDialog

In Test steht dann:
void test::OpenDialog (bool Value)
{
 testdialog Dialog(this);  // Das hier geht nicht!
}

Kann mir jemand sagen was ich ändern muss, damit das funktioniert.

Und wie muss ich dann den OpenDialog aufrufen?
Ich gehe mal davon aus das ich hier auch was ändern muss.


Viele Grüsse,
Peter

von Postix (Gast)


Lesenswert?

Du musst schon klar formulieren, was du willst. Klassen kann man 
ueberhaupt nicht aufrufen und dein rudimentaerer Code bezieht sich auf 
"Dialog", welches im Rest des Codes ueberhaupt nicht vorkommt.

von Peter (Gast)


Lesenswert?

Aufrufen / anlegen ist doch fast das selbe.

In der Klasse test gibt es eine Funktion "OpenDialog".
Diese legt eine Dialog Klasse an.
Was ich damit dann manche ist doch egal, das anlegen klappt schon nicht.

In dem Main Programm wird die Klasse test angelegt und durch eine Aktion 
soll die Funktion "OpenDialog" aufgerufen werden.

Aber wenn man C++ richtig kann sollte man schon gemerkt haben was ich 
will.

von Peter II (Gast)


Lesenswert?

Peter schrieb:
> Aber wenn man C++ richtig kann sollte man schon gemerkt haben was ich
> will.

oder es gennt niemand den fehler "Das hier geht nicht!"

gibt es nicht eine Fehlermeldung wo drin steht, was das Problem ist?

von Kail (Gast)


Lesenswert?

Peter schrieb:
> Diese legt eine Dialog Klasse an.

Eine Klasse kannst du mit C++ aber nicht zur Laufzeit anlegen. Da 
bräuchtest du schon C# oder was Vergleichbares...

von Stefan R. (srand)


Lesenswert?

Peter schrieb:
> Aufrufen / anlegen ist doch fast das selbe.

Nein.

> In der Klasse test gibt es eine Funktion "OpenDialog".
> Diese legt eine Dialog Klasse an.

Sicher nicht. Sie instantiiert vielleicht die Klasse, legt also eine 
Instanz an.

> In dem Main Programm wird die Klasse test angelegt und durch eine Aktion
> soll die Funktion "OpenDialog" aufgerufen werden.

Und das geht nicht?

> Aber wenn man C++ richtig kann sollte man schon gemerkt haben was ich
> will.

Solange nicht klar ist, wie der Konstruktor von Dialog aussieht, und wie 
Dialog vererbungsmäßig zu den anderen Klassen steht, kann doch niemand 
wissen, was dein this da bewirken soll.

von Peter (Gast)


Lesenswert?

aufrufen  anlegen  instantiieren
Leute man kann sich aber auch anstellen.
Sollte doch jeder kapieren was ich meine,
das ist doch nun wirklich nicht so schwer.


Was braucht ihr denn um diesen Fehler zu finden?
Meine 500mb Sourcen?
Normalerweise habe ich schon mehr gezeigt als nötig ist für diese Art 
Problem.

Nun der Compiler sagt this zeigt auf einen const Pointer und nicht auf 
meine WxWidgets Applikation.
Klar wohin soll der denn auch sonst zeigen. Die klasse test kennt ja 
keine Verbindung zu dem Wxwidgets System.
Und darum geht es doch.


Aber so wie es aussieht ist heute niemand hier der mir helfen kann oder 
will.

von Εrnst B. (ernst)


Lesenswert?

Peter schrieb:
> Aber so wie es aussieht ist heute niemand hier der mir helfen kann oder
> will.

Doch.
Der Fehler ist "Du kannst kein C++".
Behebbar einfach durch "C++ Lernen".

von Peter II (Gast)


Lesenswert?

Peter schrieb:
> Was braucht ihr denn um diesen Fehler zu finden?

die FEHLERMELDUNG

von Peter (Gast)


Lesenswert?

Das ich nicht gut c++ kann hatte ich schon am Anfang gesagt!

Was der Compiler meldet habe ich doch geschrieben!
Gut nicht raus kopiert aber in etwa habe ich das wieder gegeben.

von Εrnst B. (ernst)


Lesenswert?

Du hast eine Klasse "Dialog", über die wir nix wissen.
Diese hat einen Konstruktor. Dieser Konstruktor will einen Parameter, 
über den wir auch nix wissen.
Du übergibst einen Wert vom Typ "test *" an den Konstruktor. Dieser 
passt nicht.
Nachdem wir die Klasse "test" auch nicht kennen, wie sollen wir 
herausfinden, wie du die unbekannte Klasse test in den unbekannten Typ 
für den unbekannten Konstruktor-Aufruf umwandeln kannst?

von Gelacht (Gast)


Lesenswert?

Peter schrieb:
> Das ich nicht gut c++ kann hatte ich schon am Anfang gesagt!
>
> Was der Compiler meldet habe ich doch geschrieben!
> Gut nicht raus kopiert aber in etwa habe ich das wieder gegeben.

Willst du jetzt streiten oder Hilfe?
Dann gebe den Helfenden die notwendigen Infos oder lerne selbst 
programmieren!

von Peter II (Gast)


Lesenswert?

Peter schrieb:
> Was der Compiler meldet habe ich doch geschrieben!

nein hast du nicht.

> Nun der Compiler sagt this zeigt auf einen const Pointer und nicht auf
> meine WxWidgets Applikation.

das sagt er bestimmt nicht. Das hast du übersetzt.

Und this dürfte in dem Beispiel gar nicht const sein.

von Kail (Gast)


Lesenswert?

KANNST oder WILLST du die Fehlermeldung nicht posten? Der genau Wortlaut 
ist in so einem Fall wichtig.

PS: Dein Ton ist leicht unverschämt. Schalte mal einen Gang zurück...

von PittyJ (Gast)


Lesenswert?

>>Nun der Compiler sagt this zeigt auf einen const Pointer und nicht auf
meine WxWidgets Applikation.

Nun ja, in C und C++ kann man alle Pointer durch casten auf etwas 
anderes setzen.
Also mache einfach einen Cast auf den benötigten Typ, und der Compiler 
meckert nicht mehr.

von Peter (Gast)


Lesenswert?

Den genauen Wortlaut kann ich erst so ab 19Uhr kopieren.
Vorher bin ich noch unterwegs.

Unverschämt will ich nicht rüberkommen.
Aber es ist leider immer wieder das selbe:
- gib mal den ganzen Code
- rück erst mal das und jenes raus
Darum reagiere ich dann auch immer etwas genervt.

Ich versuche halt immer genug Informationen wie nötig preis zu geben.
Ich Programmiere nun genug Jahre in C und kann recht gut abschätzen was 
ausreicht.
Die Fehler Meldung habe ich zwar aus dem Kopf wieder gegeben, aber der 
eigentliche Text wird nicht viel mehr sagen.
Denn poste ich aber nachher auch hier, auch wenn ich nicht glaube das 
der hilft.

Peter

von Stefan R. (srand)


Lesenswert?

Peter schrieb:
> Ich versuche halt immer genug Informationen wie nötig preis zu geben.

Der Versuch ist gescheitert.

> Ich Programmiere nun genug Jahre in C und kann recht gut abschätzen was
> ausreicht.

Offensichtlich nicht. Jetzt haben dir schon zwei Leute ausführlich 
erklärt, welche Informationen noch fehlen (Parameter des Konstruktors, 
Klasse Dialog, Vererbungsbeziehung), um da auch nur ansatzweise was 
sagen zu können, und du pampst einfach weiter.

Mit diesem an den Tag gelegten Autismus wirst du Glück brauchen, daß dir 
überhaupt noch jemand helfen mag.

Ich jedenfalls nicht, ich bin hier jetzt raus.

von Gelacht (Gast)


Lesenswert?

Peter schrieb:
> Ich Programmiere nun genug Jahre in C und kann recht gut abschätzen was
> ausreicht.

Gerade mit dem Hintergrund solltest du wissen, daß es eben doch einen 
Unterschied ist ob ich eine Variable oder eine Konstante habe, ob es 
eine const oder keine const Variable ist
oder eben auch daß anlegen, instanziiren, definieren eine bestimmte 
Bedeutung haben.
Labern kannst du in BWL und Psychologie, in den Ingenieurwissenschaften 
zählt Präzision, auch in der Verwendung von Begriffen.

von Peter (Gast)


Lesenswert?

Gerade weil es hier nicht um Psychologie Fragen geht und jeder 
eigentlich wissen sollte was gemeint ist, auch wenn man sich mal falsch 
ausdrück, hätte ich es besser gefunden, wenn nicht jeder sich daran 
aufgeilt das man es falsch benennt.
Lieber nichts sagen!

Wer mit den ganz oben genannten Informationen nichts anfangen kann,
bedeutet entweder:
"keine Ahnung" - was nicht schlimm ist.
oder
"Es fehlt wirklich eine kleine Info" - die könnte man aber gezielt 
abfragen wenn man helfen will. Das hat aber niemand gemacht, außer der 
Frage nach der Fehler Meldung.


Das ich hier anscheiden im falschen Forum bin habe ich in zwischen auch 
gemerkt und reagiere nur noch wenn mir hier wirklich jemand helfen will.
Auf die ganzen "Das heißt aber nicht so" Kommentare habe ich keinen Bock 
mehr, die helfen niemanden.
Hier drauf brauch auch keiner reagieren, außer er kann helfen.

Und ja, ich ich bin genervt!

von Postix (Gast)


Lesenswert?

Ein Geisterfahrer? Hunderte!

von Klaus W. (mfgkw)


Lesenswert?

Peter schrieb:
> Und ja, ich ich bin genervt!

willkommen im Club!

von Gelacht (Gast)


Lesenswert?

Peter schrieb:
> Und ja, ich ich bin genervt!

Darüber ein Problem nicht so beschreiben zu können, daß andere dir 
helfen können?

von Simon B. (nomis)


Lesenswert?

Der besseren übersichtlichkeit habe ich - ähnlich wie bei deinem 
Sourcecode-Ausschnitt - meine Antwort auf das wesentliche eingedampft 
und anschließend die Buchstaben alphabetisch sortiert. Da die 
Fragestellung ja klar ist, sollte sich so die Antwort auch einfach 
erschließen lassen, die Leerzeichen erschließen sich dem Deutschkundigen 
sowieso.

,,,,.....:::DDEFFIIKNOPSUVWaaaaaaaaaaaaaaaaaaaaaaabbbbbccccccccccccc
dddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffffgghhh
hhhhhhhhhhhhhiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiikkkkkklllllllllllllllmm
mmmmmmmmnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnooooooooooooppprrrrr
rrrrrrrssssssssssssssssssssssssssttttttttttttttttttttttttuuuuuuuuuuv
wwwyzzä

Viele Grüße,
        Simon

von Gelacht (Gast)


Lesenswert?

Simon, du versüßt mir den Feierabend :-)
Danke

von Paul (Gast)


Lesenswert?


von Philip K. (philip_k)


Lesenswert?

Ok, dann erfrage ich mal gezielt eine Information:

Poste doch mal bitte die Deklarationen der Konstruktoren von testdialog 
und wxDialog.

von Philip K. (philip_k)


Lesenswert?

Gut, der ist natürlich jedem zugänglich:

wxDialog(wxWindow* parent, wxWindowID id, const wxString& title, const 
wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, 
long style = wxDEFAULT_DIALOG_STYLE, const wxString& name = "dialogBox")

von Rolf Magnus (Gast)


Lesenswert?

Peter schrieb:
> aufrufen  anlegen  instantiieren
> Leute man kann sich aber auch anstellen.
> Sollte doch jeder kapieren was ich meine,
> das ist doch nun wirklich nicht so schwer.

Darum geht es gar nicht. Wenn du die Begriffe so wild vertauschst, zeigt 
das, daß du nicht verstanden hast, wie es funktioniert. Und das wird 
einer der Gründe sein, warum dein Programm nicht geht.
Übrigens: Gerade beim Programmieren ist es wichtig, alles genau 
anzugeben, denn spätestens der Compiler kann sich nicht mehr denken, was 
du willst, wenn du was anderes hinschreibst, als du eigentlich meinst.

> Was braucht ihr denn um diesen Fehler zu finden?
> Meine 500mb Sourcen?

Nein. Aber ich nehm dir nicht ab, daß dein Programm bereits 500 MB 
Source Code hat, wenn du noch nicht mal einen Dialog aufbekommst. 
Vermutlich sind die Sourcen in Wahrheit nicht mal 1 kB groß. Das gleich 
am Anfang zu posten, hätte dir (und anderen) viel Ärger und Frust 
erspart.

> Normalerweise habe ich schon mehr gezeigt als nötig ist für diese Art
> Problem.

Du hast nahezu gar nichts gezeigt. Versuche mal, dich in die Situation 
des Antworters zu versetzen, und überlege dir, ob es wirklich möglich 
sein kann, ausschließlich mit den Informationen aus deinem Posting die 
Frage zu beantworten.
Deine Frage ist ungefähr so, als ob du beim Arzt anrufst und sagst: "ich 
war gestern Skifahren und heute tut mir was weh. Was kann man jetzt 
dagegen tun?"

Peter schrieb:
> Unverschämt will ich nicht rüberkommen.
> Aber es ist leider immer wieder das selbe:
> - gib mal den ganzen Code
> - rück erst mal das und jenes raus

Das liegt halt daran, daß immer wieder grundlegende Infos fehlen, was 
übrigens auch sehr nervt.

Peter schrieb:
> "Es fehlt wirklich eine kleine Info"

Eher "es fehlen nahezu alle Infos"

> - die könnte man aber gezielt abfragen wenn man helfen will.

Das wurde auch mehrfach getan. Leider hast du versäumt, die Infos zu 
geben. Stattdessen faselst du was von 500 MB Sourcen und gibst deine 
freie Interpretation der Compiler-Meldung an.

Philip K. schrieb:
> wxDialog(wxWindow* parent, wxWindowID id, const wxString& title, const
> wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
> long style = wxDEFAULT_DIALOG_STYLE, const wxString& name = "dialogBox")

Mit dem Konstruktor von wxDialog alleine kann man nicht wirklich was 
anfangen. Man braucht den Konstruktor von testdialog. Wenn dort der 
erste Parameter auch ein wxWindow* sein sollte, braucht man die 
Vererbungshierarchie von test. Wenn das nicht von wxWindow abgeleitet 
sein sollte, wird's wohl so nicht gehen können. Was man dagegen tun 
kann, sollte die Doku von wxWindow verraten.

von C++ (Gast)


Lesenswert?

Klingt eher nach 500MB Sourcen runtergeladen, dran geschraubt und 
schnell festgestellt, daß man mental überfordert ist. C++ von der Syntax 
her zu kennen ist eins, bei komplexen Frameworks ist aber die 
Klassenhierarchie das größere Hindernis. Und die Vorstellung, daß jeder 
wxIrgendwas kennen müsste und noch mehr, daß man ein Anspruch auf 
Fehlerbehebung durch Andere hätte, das ist schon " gewöhningsbedürftig".
Schreib erst mal ein Minimalprogramm, das nur den Dialog aufmacht. 
Eventuell ist das ja einfacher als gedacht und funktioniert. Dann frag 
dich, was in dem 1/2 GB anders sein könnte.
Erfahrung sammelt man nicht, wenn's ein anderer für einen macht!

von Simon B. (nomis)


Lesenswert?

C++ schrieb:
> C++ von der Syntax her zu kennen ist eins [...].

Aber das ist ja nicht mal gegeben.
1
testdialog Dialog(this);  // Das hier geht nicht!

(wobei "testdialog" ein Typ bzw. eine Klasse ist)

ist ja syntaktische Grütze. Keine Variablendeklaration (Name fehlt), 
keine instanziierung eines Objektes ("= new" fehlt), bestenfalls mit 
viel gutem Willen ein Funktionsprototyp an einer falschen Stelle mit 
den falschen Identifiern.

Wie in meiner Antwort oben geschrieben:

> In deinem Programmausschnitt fehlen die Klassendefinitionen.
> Es kann auch nicht mal compilieren, da da mindestens ein paar
> entscheidende Semicolons fehlen.
> Weiterhin steht in test::OpenDialog etwas, von dem nicht klar ist,
> ob es eine Variablendeklaration oder ein Funktionsaufruf ist.
> In beiden Fällen ist es syntaktisch falsch.
>
> Um es kurz zu machen: Nein, Du hast noch nicht beschrieben was du
> tun willst.

Viele Grüße,
        Simon

von Peter II (Gast)


Lesenswert?

Simon Budig schrieb:
> Aber das ist ja nicht mal gegeben.
> testdialog Dialog(this);  // Das hier geht nicht!
>
> (wobei "testdialog" ein Typ bzw. eine Klasse ist)
>
> ist ja syntaktische Grütze. Keine Variablendeklaration (Name fehlt),
> keine instanziierung eines Objektes ("= new" fehlt), bestenfalls mit
> viel gutem Willen ein Funktionsprototyp an einer falschen Stelle mit
> den falschen Identifiern.

also für micht ist das vom Syntax her sauber.

Es wird ein neues Objekt vom Type testdialog mit dem namen Dialog mit 
einen kontruktur angelegt.
1
class A { public: A(int) {} };
2
3
int main()
4
{
5
   A a(1);
6
};

von Simon B. (nomis)


Lesenswert?

Peter II schrieb:
> also für micht ist das vom Syntax her sauber.

Njargh, du hast wohl recht. Ich habe "Dialog" immer als Klassenname 
gelesen.

Grüße,
        Simon

von Peter (Gast)


Lesenswert?

Endlich mal was vernünftiges.
Peter II hat vollkommen recht, new braucht hier kein Mensch.

Mein Code ist logischerweise nicht 500mb groß, die 50kb hat Der aber 
schon lange überschritten. Ich bin am Umschreiben / Umstrukturieren, da 
einiges in Libs gepackt werden soll.


So Leute mein Fehler ist so banal,
das es mir zeigt das die meisten auch wenig Ahnung haben, aber viel 
reden.

Wie gesagt: testdialog Dialog(this);  // geht nicht!
Da this auf was falsches zeigt.
Das habe ich auch gesagt und könnte zudem jedem auffallen.

Diese Info muss man nur übergeben.
Hoffentlich habe ich "wxWindows" jetzt richtig geschrieben.

void test::OpenDialog (bool Value, wxWindows * parent )
{
 testdialog Dialog(parent);  //und nun geht alles!
}

Jetzt muss man nur noch aus dem Hauptprogramm den OpenDialog 
entsprechend aufrufen und fertig ist das ganze.

Das ganze kann man möglicherweise auch mit Vererbung hin bekommen,
aber das braucht es hier nicht.


Viele Grüße,
Peter

von Simon B. (nomis)


Lesenswert?

Peter schrieb:
> So Leute mein Fehler ist so banal,
> das es mir zeigt das die meisten auch wenig Ahnung haben, aber viel
> reden.

Oh wow.

Viele Grüße,
        Simon

von Peter II (Gast)


Lesenswert?

Peter schrieb:
> Wie gesagt: testdialog Dialog(this);  // geht nicht!
> Da this auf was falsches zeigt.

du schuldest uns immer noch die genaue Fehlermeldung!

> void test::OpenDialog (bool Value, wxWindows * parent )
> {
>  testdialog Dialog(parent);  //und nun geht alles!
> }

deine Klasse test ist auch kein wxWindows, damit ist doch wohl klar 
warum this hier nicht passt.

von Hugo (Gast)


Lesenswert?

Peter schrieb:
> Peter II hat vollkommen recht, new braucht hier kein Mensch.

Ich würde mich bei Deinem wissen, nicht so weit aus dem Fenster lehnen, 
denn

Peter schrieb:
> Wie gesagt: testdialog Dialog(this);  // geht nicht!
> Da this auf was falsches zeigt.

beweist, dass Du keine Ahnung hast.

von Peter (Gast)


Lesenswert?

Stimmt die Fehlermeldung!
Hatte gestern den Fehler behoben und die Meldung nicht wieder bekommen. 
Müsste erst den Fehler wieder einbauen um die genaue Fehlermeldung zu 
bekommen, aber das brauchen wir doch nicht wirklich noch?

Darum hatte ich doch auch gefragt wo mein Fehler ist.
Eine kurze Antwort "Die Klasse test ist kein wxWindows, da musst Du XYZ 
machen" und schon wäre der ganze schreib Kram hier überflüssig gewesen.

von Peter (Gast)


Lesenswert?

Etwas Ahnung habe ich dann doch schon, nur bin ich nicht ein c++ Profi.
Darum mache ich immer wieder Fehler oder komme nicht weiter.

von Hugo (Gast)


Lesenswert?

Peter schrieb:
> "Die Klasse test ist kein wxWindows, da musst Du XYZ
> machen" und schon wäre der ganze schreib Kram hier überflüssig gewesen.

Es ist oft eine gute Lösung ein Problem heuristisch zu lösen. Dennoch 
haben heuristischen Lösungen ihre Tücken. Irgendwann rächt es sich, wenn 
man mit Dingen arbeitet, die man gar nicht versteht. Das sind dann diese 
Programme, die irgendwann spontan abschmieren und keiner weiß warum. 
Lerne lieber die Grundlagen von C++. Wenn Du immer wieder per Trial and 
error zu einer befriedigenden Lösung kommst, wirst Du dennoch immer an 
einen Punkt kommen, der Dich zwingen wird wieder so einen Thread hier 
aufzumachen.

von Simon B. (nomis)


Lesenswert?

Peter schrieb:
> Stimmt die Fehlermeldung!
[...]>
> Darum hatte ich doch auch gefragt wo mein Fehler ist.

Fehlermeldungen haben die Funktion, dir dabei zu helfen, Fehler zu 
finden. Die geben normalerweise sehr konkrete Hinweise was falsch ist.

Nur muss man sie dafür auch lesen können. Und das hast du uns nicht 
zugestanden, weswegen wir hier wild im Nebel stochern mussten.

Nunja, offensichtlich sind wir unfähig wenn wir im Nebel den Fehler 
nicht finden können. Was das für deine Kompetenz bedeutet wenn du ohne 
Nebel den Fehler nicht findest muss man ja nun nicht weiter 
ausdiskutieren.

Viele Grüße,
        Simon

von Peter II (Gast)


Lesenswert?

Peter schrieb:
> Eine kurze Antwort "Die Klasse test ist kein wxWindows, da musst Du XYZ
> machen" und schon wäre der ganze schreib Kram hier überflüssig gewesen.

und diese hätte man aber nicht wissen können ohne die Fehlermleldung zu 
sehen.

von C++ (Gast)


Lesenswert?

Warum antwortet identisch noch irgendwer auf einen so freundlichen 
Zeitgenossen?
@Peter: Niemand hat irgend ein Verpflichtung deine geheimen Probleme zu 
lösen! Gewöhn dir einfach mal einen anderen Umgangston an, dann mag man 
dir vielleicht helfen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.