Seite 1 von 2

Not declared in scope und solche Dinge [geloest]

Verfasst: 25. Februar 2007 04:16
von joebar
Hallo,

nach langer Pause immer noch mein altes Problem...

Ich habe folgende Klassen:

Code: Alles auswählen

testapp : public QMainwindow
mywidget : public QWidget
Add : public mywidget
Sub : public mywidget
Fuer jede Klasse habe ich ein .cpp und ein .h File. Das UI ist ueber den Designer erstellt und wird im Konstruktor von testapp aufgebaut. Im UI gibt es ein lineedit mit dem Namen c1.

In Add.cpp habe ich jetzt folgenden code eingefuegt:

Code: Alles auswählen

void Add::calc(){
c1 -> setText("bla");
return;
}
Da kommt dann

Code: Alles auswählen

error 'c1' was not declared in this scope
Der gleiche Code in testapp.cpp funktioniert. Die Aufteilung ueber diverse Files moechte der Uebersicht wegen erreichen.

Das komplette Coding ist mal angehangen.

Danke,
J.

Verfasst: 25. Februar 2007 08:26
von upsala
Und warum deklarierst du dann c1 nicht bei Add? Und nein, du verwendest in testapp.cpp nicht den selben Code...

Verfasst: 25. Februar 2007 09:45
von joebar
okay WUERDE ich den Code in testapp.cpp haengen klappts.... war sprachlich wohl etwas ungenau.

Tja mit dem deklarieren ist das so eine Sache. Das c1 kommt ueber den designer rein, ich habe es also nirgends expliziert deklariert. Wie soll ich das denn machen?

Verfasst: 25. Februar 2007 09:57
von upsala
Genauso wie in testapp.cpp...

Verfasst: 25. Februar 2007 12:13
von joebar
Da habe ich es doch impliziet mit dem include von testapp.h gemacht. Wenn ich in Add.cpp nun aber #include "testapp.h" rein setze dann bringt mir das rein gar nichts.

Kannst du mir einen noch etwas konkrteren Tip geben?

Danke,
J.

Verfasst: 25. Februar 2007 16:10
von horchi
Hi joebar,

c1 ist ein Member der Klasse testapp, nicht der Klasse Add, daher dort nicht bekannt. Du könntest Add einen Pointer auf die Instanz von testapp übergeben und dann über diesen auf c1 zugreifen. Wenn es das ist was du möchtest?
Nur wird m.E. die Methode Add::calculate_add() noch nirgends aufgerufen, ....

Grüße
horchi

Verfasst: 25. Februar 2007 16:37
von joebar
wird auch nocht nicht aufgerufen. will erstmal das scope Problem loesen.

Der Vorschlag mit dem Pointer, na ja momentan habe ich nur c1, spater habe ich hundert Objekte und dann muss ich irgendwie (wie auch immer) hundert Pointer uebergeben. Das ist irgendwie nicht elegant.

Mir geht es nur darum meinen Sourcecode in verschiedene Files zu verteilen damit hinterher das warten einfacher wird. Bin also offen fuer alle Vorschlaege, der von mir gewaehlte Ansatz wurde mir hier mal vorgeschlagen.

Danke,
J.

Verfasst: 25. Februar 2007 17:45
von horchi
Hi,
irgendwie (wie auch immer) hundert Pointer uebergeben.
nein, wie gesagt nur den der Klasse testapp. Das könntest du z.B. im Konstruktor machen

Code: Alles auswählen

Add:Add(testapp* pApp)
{
  app = pApp;
}
und über diesen Pointer auf die Dialogelemente Zugreifen:

Code: Alles auswählen

app->c1->setText(".....")
/EDIT Ups war noch nicht fertig und bin auf senden gekommen :?

Verfasst: 26. Februar 2007 02:50
von joebar
das ergibt dann

Code: Alles auswählen

g++ -c -pipe -fno-strict-aliasing -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_SHARED -I/usr/share/qt/mkspecs/default -I. -I/usr/include/QtGui -I/usr/include/QtCore -I/usr/include -I. -I. -I. -o Add.o Add.cpp
Add.cpp:5: error: prototype for ‘Add::Add(testapp*)’ does not match any in class ‘Add’
Add.h:6: error: candidates are: Add::Add(const Add&)
Add.h:8: error:                 Add::Add()
Add.cpp: In constructor ‘Add::Add(testapp*)’:
Add.cpp:6: error: ‘app’ was not declared in this scope
Add.cpp: In member function ‘void Add::calculate_add()’:
Add.cpp:26: error: ‘app’ was not declared in this scope
make: *** [Add.o] Error 1


Verfasst: 26. Februar 2007 07:30
von horchi
Hi,

dass sollte kein fertiges Programm sondern nur ein Lösungsvorschlag sein. Du musst min noch den Header entsprechend anpassen:

Add.h

Code: Alles auswählen

#ifndef ADD_H
#define ADD_H

#include "testapp.h"
#include "mywidget.h"

class Add : public mywidget
{
   public:

      Add(testapp* pApp);
      ~Add();
      
      void calculate_add();

   private:

       testapp* app;
};

#endif
Grüße
horchi

Verfasst: 26. Februar 2007 07:33
von Christian81
Manchmal frage ich mich ob das Forum hier C++ für Anfänger heisst... :roll:

Wir sind ein Qt-Forum. Und Qt kann man nur lernen wenn man zumindest die Grundlagen C++ versteht! Also kauft ein ein C++ Buch oder schaut im Netz.

Verfasst: 26. Februar 2007 11:02
von joebar
Danke fuer die nette Antwort.

Auch wenn du es dir vielleicht nicht vorstellen kannst es gibt Leute die durchaus auch noch Probleme mit c++ haben. Ich hatte meine Frage auch zu erst in einem C++ Forum gestellt, leider konnte man da mit dem Qt Code nichts anfangen. Achso, und nein ich will nicht irgendwelche Kommandozeilentools schreiben, die Anwendung die ich schreiben moechte braucht ein GUI.

Fuer wen meine Frage unter Niveau ist braucht nicht zu antworten, das ist schon okay. Freue mich natuerlich trotzdem ueber sinnvolle Antworten.

Konstruktiver Vorschlag: Wie waers mit einer Kategorie Anfaengerfragen? Dann fuehlt sich im Profiforum vielleicht keiner belaestigt?

Danke,
J.

PS: Man bekommt in C++ Foren auch schonmal die Antwort man solle erst C lernen. Wahrscheinlich wuerde man im C Forum erstmal auf Basic verwiesen und dort dann auf Niki den Roboter.

Verfasst: 26. Februar 2007 11:07
von Christian81
Der vom Compiler generierte Fehler ist für jemanden, des halbwegs C kann durchaus sehr verständlich, oder was kann man an "error: prototype for ‘Add::Add(testapp*)’ does not match any in class ‘Add’ " nicht verstehen?
Ihr wollt immer alles vorgekaut haben (was man schon daran sieht dass Du einfach per copy'n'paste kopiert hast ohne Dich auch nur im geringsten damit zu befassen, sonst hätte man die Fehlermeldung auch sehr schnell kapiert) - das ist das Problem das ich hier habe. Einen Anfänger bei dem ich sehe dass er sich auch damit befasst was man ihm versucht zu erklären helfe ich gerne.

Verfasst: 26. Februar 2007 11:47
von joebar
Ich habe nie behauptet, dass C nicht helfen wuerde was zu verstehen. Ist nur die Frage ob man einem sagt der portugiesich lernen will lern erstmal spanisch und man dem sagt lern erstmal italianisch und dem man soll erstmal latain lernen.

Du hast Recht ich habe copy 'n' paste gemacht, aber wenn mir jemand einen Code anbietet ist das wohl auch der erste Schritt den man macht. Du hast allerdings kein Recht wenn du behauptest ich haette mir keine Gedanken gemacht. Wenn ich das sagen darf halte ich es fuer sehr unhoeflich erstmal anzunehmen man habe nicht nachgedacht oder habe Google nicht bemueht. Man sollte doch erstmal seinem Gegenueber positiv begegnen. Ich bin Anfaegner, ich habe im Schnitt vielleicht in der Woche ca.. 1 Stunde wo ich mich mit dem Thema C++/Qt befassen kann. Ich komme also nur langsam voran.

Wie gesagt ich bin gerne bereit im dummy Forum zu posten. Bin auch gerne bereit wenn ich ein paar Grundgerueste habe einen How to Guide fuer euer Forum zu schreiben "How to start Qt for C++ newbies". Ich glaube das koennte fuer viele Leute hilfreich sein. Wenn einer C++ lernt will er nunmal was machen was sexy ist und das sind GUI Programme und keine Kommandozielen Tools. Vielleicht motiviert das Angebot ja zu etwas unterstuetzung, bin durchaus bereit etwas zurueck zu geben.

Ich bin mir sicher dass du als du C++/Qt gelernt hast dich mit Kollegen/Freunden/Kommilitonen ueber Probleme ausgetauscht hast, da faellt eine dumme Frage nicht schnell auf. Rein ueber Foren zu lernen ist ungleich schwerer.

Verfasst: 26. Februar 2007 11:59
von Christian81
Ich sehe Du meinst es wirklich ernst. Das ist schön.
Allerdings muss ich nochmal drauf rumhacken - was ist an dieser Fehlermeldung so schlimm bzw. schwer zu verstehen:

prototype for ‘Add::Add(testapp*)’ does not match any in class ‘Add’

Er findet den Prototyp Add:Add(testapp*) nicht in der Klasse Add. Also schaue ich in der Klasse Add nach und siehe da - der ctor ist wirklich nicht da. Also ist da was falsch - entweder im Header oder in Source. Und da der Sinn war testapp der Klasse zu übergeben würde ich sagen der Header war falsch.