Elementfunktion sei in Klasse nicht deklariert
-
Xx_Mephisto_xX schrieb:
Leider kommt jetzt meine c++-Unkenntnis zum tragen.
Was versteht man unter einer Indirektion?
Ich hatte mal etwas von einer Überladung des -> Operators gelesen. Ist es das?folgende include-beziehungen habe ich derzeit:
main includiert : - image - hist
hist includiert : - imageAlso wäre die Antwort A includiert B aber nicht umgekehrt
Richtig.
Mit Indirektion meine ich sowas:
A includiert B
B inkludiert C
C inkludiert D
und D inkludiert AA --> B ^ | | v D <-- C // anstatt A <-> BDas ist halt wenn die Abhängigkeiten nicht direkt sind, sondern über ein paar Umwege (sprich andere Dateien)
-
@ krümelkacker
Vielen Dank für deine Ratschläge.
bezüglich der Geschichten mit "new": ich orientierte mich da an dem Buch "c++ in 21 Tagen" (Einführung in Kopierkonstruktoren).
Der Vorschlag mit den Funktionstemplate's klingt interessant.
Zwar tun sich da ein paar Fragezeichen auf, aber die werden sich hoffentlich mit einer Rechercheaufgabe abwenden lassen.
Ich werde versuchen deine Vorschläge in die Tat umzusetzen

Ich hätte da an dieser Stelle aber eine Frage bezüglich des void-Zeigers image.
bisher brauche ich den TIFF-Zeiger diesen für folgende Zeile:
(Ausschnitt des Konstruktors)image = TIFFOpen(filename, "r");laut LIBTiff ist TIFFOpen wie folgt definiert:
TIFF* TIFFOpen(const char *filename, const char *mode)würde mir das dann nicht Probleme machen?
-
Ah, ok, klingt schwer nach einer bösen Dauerschleife.^^
Mmh, in meiner hist.cpp:
HIST::HIST(IMAGE& inputImg){ histSize = pow(2,inputImg.GetBPS()); histBuffer = new unsigned long[histSize]; unsigned int tmp = 0; for(unsigned int row=0; row < inputImg.GetLENGTH(); row++){ for(int i=0; i<(inputImg.GetWIDTH()); i++){ tmp = inputImg.GetBufferValue(i+row*2*(inputImg.GetWIDTH())); histBuffer[tmp] = histBuffer[tmp] + 1; } } }benutze ich ja ein übergebene IMAGE Könnte dadurch eine Indirektion vllt doch zustande kommen? Oder geht es dabei wirklich nur um den #include -Befehl?
-
Ah, sry, habe gemerkt, dass mein letzter Beitrag Blödsinn war

-
Xx_Mephisto_xX schrieb:
SCHIRSCHADENDUDEL springt nun mitten aus meiner classIMAGE hervor

g++ -Wall main.cpp image.cpp hist.cpp -ltiff -o ausgabe In file included from main.cpp:5:0: image.h:83:1: Fehler: »SCHIRSCHADENDUDEL« bezeichnet keinen Typ image.cpp:405:20: Fehler: keine Elementfunktion »void IMAGE::invert()« in Klasse »IMAGE« deklariert image.cpp:406:18: Fehler: keine Elementfunktion »void IMAGE::test()« in Klasse »IMAGE« deklariert In file included from hist.h:4:0, from hist.cpp:1: image.h:83:1: Fehler: »SCHIRSCHADENDUDEL« bezeichnet keinen Typ make: *** [all] Fehler 1Nun steh' ich hier ich armer Tor...
Hab's gerade mit den beiden Files, so, wie Du sie eingestellt hast versucht.
Klappt!furblewurble@sinsemilla /tmp $ cat test.cc #include "image.h" int main(){ IMAGE i; i.invert(); } furblewurble@sinsemilla /tmp $ g++ -pedantic -Wall image.cc test.cc -o test -ltiff image.cc: In member function ‘void IMAGE::ReadIMAGEDATA() const’: image.cc:138:67: warning: format ‘%i’ expects argument of type ‘int’, but argument 4 has type ‘tsize_t {aka long int}’ [-Wformat] image.cc: In member function ‘void IMAGE::grauwertStreckung(IMAGE&)’: image.cc:310:14: warning: long, short, signed or unsigned used invalidly for ‘Min’ [-pedantic] furblewurble@sinsemilla /tmp $Das ist ja doof.

Vielleicht ein Backslash am Ende der Zeile vorinvert()in image.h, der das Zeilenende unterdrückt? *phantasiert fröhlich*
-
Falls du irgendwo eine vom vom GCC generierte .pch-Datei rumfliegen hast, weil du mal versehentlich einen Header separat kompiliert hast, dann lösch die mal.
Xx_Mephisto_xX schrieb:
bezüglich der Geschichten mit "new": ich orientierte mich da an dem Buch "c++ in 21 Tagen" (Einführung in Kopierkonstruktoren).
Ich kenne das Buch nicht. Aber der Titel klingt schonmal sehr abschreckend. Gute C++ Bücher haben den Verkaufstrick "in 21 Tagen" nicht nötig. Wenn du eine kompakte und gute Einführung in C++ haben willst, schau mal nach "Accelerated C++" von Koenig und Moo. Zugegeben, "accelerated" klingt auch etwas komisch, aber in diesem Fall stimmt es. Es bezieht sich auf den Lehr- und Programmierstil. Die Reihenfolge, in der die Sachen beigebracht werden, führt dazu, dass man relativ früh produktiv ist.
Wenn dir "C++ in 21 Tagen" recht früh new[]/delete[] beibringt, dann kann das schonmal nicht soooo gut sein, weil new[]/delete[] eher unpraktisch gegenüber std::vector sind.
Xx_Mephisto_xX schrieb:
Der Vorschlag mit den Funktionstemplate's klingt interessant.
Zwar tun sich da ein paar Fragezeichen auf, aber die werden sich hoffentlich mit einer Rechercheaufgabe abwenden lassen.
Es war nicht wirklich ein Vorschlag, dass du das so machen sollst. Es war als Hinweis gedacht, wie man den Kram generischer machen kann, und dass auch die Standardbibliothek so einen Ansatz verfolgt.
Xx_Mephisto_xX schrieb:
Ich hätte da an dieser Stelle aber eine Frage bezüglich des void-Zeigers image.
bisher brauche ich den TIFF-Zeiger diesen für folgende Zeile:
(Ausschnitt des Konstruktors)image = TIFFOpen(filename, "r");laut LIBTiff ist TIFFOpen wie folgt definiert:
TIFF* TIFFOpen(const char *filename, const char *mode)würde mir das dann nicht Probleme machen?
In diesem Fall nicht, weil eine Adresse vom Typ TIFF* implizit in eine Adresse vom Typ void* umgewandelt werden kann. Wenn du allerdings danach eine andere TIFF-Funktion aufrufen willst, musst du dies ja rückgängig machen. Dazu ist der static_cast da. Das mit dem void* war auch nur so eine Idee, damit du den Tiff-Header in deinem Header nicht inkludieren musst. Wenn dir das nicht wichtig ist, kannst du es auch mit void* sein lassen. Du kannst dir in der image.cpp auch eine kleine Helferfunktion dazu basteln:
inline TIFF* tiffptr(TiffImage const* self) { return static_cast<TIFF*>(self->image); } ::: TiffImage::~TiffImage() { if (image) TIFFClose(tiffptr(this)); }oder so ähnlich ...
-
@Furble Wurble
Also ich kann invert() nach belieben innerhalb der .h verschieben und die Fehlermeldung ist die selbe

wenn ich den Zusatz von "IMAGE::" in der .cpp weglasse hat der Compiler weder mit der in der .h definierten void invert() noch mit der void invert(){}-funktion innerhalb der .cpp ein Problem.
Das sollte ja dann auch die Backslash-Idee leider vereiteln oder?Aber was ich interessant finde ist, dass dir 2 weitere Warnungen ausgegeben werden.
Ach ist das ärgerlich, es hatte bisher alles so hübsch geklappt.
und jetzt haut mir soetwas dazwischen.Mein Programm besteht bislang nur aus main, image (h + cpp) und hist (h + cpp).
Und die Quelltexte, die ich hier geschrieben habe, waren vollständige Kopien dieser Dateien (mit außnahme der hist, aber die benutzt image nur im konstruktor und bindet image via include in der hist.h ein).was also mache ich anders, wenn es bei dir kompiliert und bei mir nicht ^^
Und vorallem, warum meckert der compiler dann nur bei invert und test und nicht auch bei den anderen funktionen.
-
krümelkacker schrieb:
Falls du irgendwo eine vom vom GCC generierte .pch-Datei rumfliegen hast, weil du mal versehentlich einen Header separat kompiliert hast, dann lösch die mal.
Du hattest Recht gehabt, es lag eine image.gch Datei in meinem Projekt Ordner
und siehe da: ES FUNKTIONIERT
*glücklich*Damit wäre das Thema erfolgreich abgeschlossen und das nur dank EURER Hilfe. Ich wäre wohl niemals darauf gekommen. Vielen vielen Dank. Mein erster Forumtag und schon fühle ich mich hier sehr gut beraten

Hier bin ich Mensch, hier darf ich sein (um mal den bereits zitierten Goethe nochmal zu bringen
)
-
Das liegt aber daran, dass du selbst Gas gibst und Initiative zeigst.
Viele kommen hierher und meinen, dass wir ihnen ihre simpelsten hausaufgaben mal eben so machen (das können haben heir wzar die meisten dafür, aber das will keiner machen), nur damit sie in 3-5 Jahren selbst mal Chef in einer Programmierarbteilung sitzen, von Tuten und Blasen keine Ahnung haben, aber meinen sie könnten es.
Du machst da alles richtig, bleib dran, dann findest du hier freunde fürs Leben

Herzlich Willkommen !
-
Danke,
nun heißt es aber erstmal nen Päuschen einlegen. Die Nacht war nicht lang und das Problem zerrte ein wenig an meiner Hoffnung. Aber das wird bestimmt nicht die letzte Frage gewesen sein, die ich stellte

Ich bin mit Foren noch nicht so sehr vertraut: Gibt es hier eine Möglichkeit diesen Thread als abgeschlossen zu markieren?
-
Nein. Ist nicht vorgesehen. Einfach untergehen lassen.
(Vllt kannst du den Titel dahingehend ändern, als dass du Gelöst reinschreibst oder sowas)
-
Skym0sh0 schrieb:
Das liegt aber daran, dass du selbst Gas gibst und Initiative zeigst.
Viele kommen hierher und meinen, dass wir ihnen ihre simpelsten hausaufgaben mal eben so machen (das können haben heir wzar die meisten dafür, aber das will keiner machen), nur damit sie in 3-5 Jahren selbst mal Chef in einer Programmierarbteilung sitzen, von Tuten und Blasen keine Ahnung haben, aber meinen sie könnten es.
Du machst da alles richtig, bleib dran, dann findest du hier freunde fürs Leben

Herzlich Willkommen !

Von mir auch!