C++ Methode wird nicht gefunden

Sadakazu

Well-Known Member
Ich dreh hier grad echt am Rad...

ich hab ne eigene Bibliothek die ich neben dem Projekt das ich grad entwickel, weiter ausbaue und weiter entwickel...

Diese Bibliothek ist soweit in meinem Projekt mit eingebunden, ich kann auch alles aus der Bibliothek benutzen.... soweit kein Problem...

Jetzt hänge ich aber bei einer Klasse fest, wo ich grad ein paar spezifische Funktionen hinzugefügt habe....

So nennen wir das ganze beim namen....
ProxyServer erbt aus der Klasse Server alle Methoden.
In ProxyServer hab ich aber spezifische Funktionen die zu einem Server nicht passen.
Also bin ich bei gegangen und habe sowohl die Header als auch die CPP mit dem methoden erweitert die ich wollte.... Bibliothek neu kompielert und ins projekt neu importiert....

So...
Ich kann über ProxyServer alle Funktionen aus der Server Klasse aufrufen.
Aber ich kann grad keine Funktionen und Variablen in aus der Kind Klasse abrufen...

Woran liegt das?

Code
Code:
//ProxyServer.h
#ifndef PROXYSERVER_PROXYSERVER_H_
#define PROXYSERVER_PROXYSERVER_H_

#include "../Server/Server.h"

namespace nc {

class ProxyServer: public Server {
public:
   ProxyServer();
   virtual ~ProxyServer();

   bool installStatus;


   bool isInstalled();
   bool installProxy();
   bool makeStandardConfig();
};

} /* namespace nc */

#endif /* PROXYSERVER_PROXYSERVER_H_ */





//ProxyServer.cpp

#include "ProxyServer.h"

namespace nc {
ProxyServer::ProxyServer() {
}

ProxyServer::~ProxyServer() {
}

bool ProxyServer::isInstalled() {

// MyCode here
  return ture;
}

bool ProxyServer::installProxy() {
// MyCode here
  return ture;

}

bool ProxyServer::makeStandardConfig() {
// MyCode here
     return ture;
}

} /* namespace nc */
###############################################
//SystemUtilities.h
bool SystemUtilities::startUp():

//SystemUtilities.cpp
bool SystemUtilities::startUp() {
   nc::ProxyServer* proxy = new ProxyServer();
   proxy->isInstalled(); // wird unterkringelt mit Method isInstalled() could not be resolved
}

Warum kann ich nicht auf die Funktion zugreifen!?
Alle anderen Funktionen aus der Server.h (Eltern Klasse) kann ich zugreifen, nur nicht auf die Funktionen die ich für die Kind Klassen erstellt hab....
ich kann die Funktion auch nicht in der Auswahl liste anwählen... siehe dazu das bild.....
Hat irgendjemand eine Idee???
 

Anhänge

  • Tooltip_223.png
    Tooltip_223.png
    16,3 KB · Aufrufe: 415
Zuletzt bearbeitet:
Ich kann auf den ersten Blick auch nichts finden (abgesehen von Tipp- oder Kopierfehlern und davon dass beim Aufruf "new ProxyServer()" der namespace fehlt) Solche Link-Fehler sind manchesmal hartnäckig und liegen oft an einer dummen Kleinigkeit oder irgendwelchen Eigenarten des Compilers. Ich gehe mit solchen Sachen so damit um dass ich alles überflüssige lösche oder auskommentiere und dann Stück für Stück rekonstruiere.
Alle anderen Funktionen aus der Server.h (Eltern Klasse) kann ich zugreifen, nur nicht auf die Funktionen die ich für die Kind Klassen erstellt hab....
Na ja, Konstruktor und Destructor werden in der Liste angezeigt, was ja schon was ist und auch etwas sagt.

Nicht wirklich hilfreich, aber vielleicht bringt es dich auf die Spur. So etwas gehört zu den Freuden der Programmierung. :rolleyes:

Peter
 
Ich kann auf den ersten Blick auch nichts finden (abgesehen von Tipp- oder Kopierfehlern und davon dass beim Aufruf "new ProxyServer()"
Rein Theoretisch bräuchte ich den namespace gar nicht angeben, da alles ja im gleichen namespace liegt....
Aber daran hat es auch nicht gelegen...

Und was sagt der Compiler?
habs eben durchlaufen lassen.... jetzt wird auch proxy unterkringelt...
Ebenfalls mit dem netten hinweis, das der verweis nicht gefunden werden kann....

Aber der Header ist doch drin oO...

Ich hab mal Bilder hochgeladen....
225 Zeigt den Compilerfehler
226 Zeigt den Header von SystemUtilities.h
227 Zeigt den Header von ProxyServer.h

So etwas gehört zu den Freuden der Programmierung.
:D und wenn man dann noch alles alleine "lernt" und alleine entwickelt stolpert man ganz schnell ganz leicht mal und fliegt auch öfters auf die Nase :D
 

Anhänge

  • Auswahl_225.png
    Auswahl_225.png
    67,1 KB · Aufrufe: 393
  • Auswahl_226.png
    Auswahl_226.png
    24,9 KB · Aufrufe: 388
  • Auswahl_227.png
    Auswahl_227.png
    31,2 KB · Aufrufe: 381
Wenn SystemUtilities in namespace nc sind ,also im gleichen wie ProxyServer, brauchtst du (wenn ich mich nicht irre) in SystemUtilities den namespace nicht mit angeben. Versuch es mal ohne den nc::Prefix in SystemUtilities.cpp.

Ich denke nc würde dann zu einem nc::nc::ProxyServer, also eine Subnamespace. Bin mir aber nicht sicher. HTH
 
also ich habs sonst projektweit (andere teile funktionieren ja) mit nc::KLASSE geschrieben.... also auch bereiche die im gleichen Namespace liegen...
Frag mich nicht warum, aber ich find es so ein bisschen schöner....
Aber, hab jetzt das nc:: mal raus genommen.... und siehe da... Fehler bleibt....

Importiert hat er den Header aber. Zu mindestens motzt die IDE nicht
 

Anhänge

  • Auswahl_235.png
    Auswahl_235.png
    58,5 KB · Aufrufe: 376
  • Auswahl_237.png
    Auswahl_237.png
    8,7 KB · Aufrufe: 361
*SPAM*
Also... ich hab jetzt nochmal ne "Debug" klasse erstellt...
Ich hab ja mehrere Klassen die aus Server.h erben....
ProxyServer
DynamicServer
StaticServer

erben alle Funktionen und Eigenschaften von Server....
Alle 4 Klassen zusammen, bilden eine Bibliothek. Das Kompilieren der Bibliothek ergab keine Fehler.

Im Projekt ist die Bibliothek (glaube ich jedenfalls) korrekt eingebunden. Sonst könnte ich ja nicht <ProxyServer/ProxyServer.h> inkludieren, ohne das die IDE da schon motzen würde....
Okay soweit so gut...
Jetzt hab ich mir wie gesagt eine neue klasse im Projekt angelegt. Dort habe ich eine einzige Funktion drin und die soll nix anderes machen als jeden Servertyp einmal erzeugen, anschließend 2 Funktionen der Elternklasse aufrufen (eine erzeugt innerhalb der ProxyServer/DynamicServer/StaticServer klasse ein neues objekt die andere gibt das objekt aus)
Und anschließend sollen die Objekte alle vom Heap gelöscht werden....
Während des schreibens des Codes gab es auch keine unterkringelungen, die auf fehler hindeuteten.
Hab mich schon gefreut. Oh sieht aus als wenn das klappt....
Dann kam die ernüchterung beim Compilen....

Fehlender verweis auf nc::ProxyServer::ProxyServer();
Fehlender verweis auf nc::StaticServer::StaticServer();

Und Proxy und Static wurden unterkringelt...
HÄ?!
DynamicServer lief fehlerfrei durch.....

DynamicServer, StaticServer sehen 100% identisch aus, da ich noch keine Anpassungen der beiden klassen vorgenommen habe.....
jetzt bin ich komplett verwirrt.... oO
 

Anhänge

  • Auswahl_239.png
    Auswahl_239.png
    26,4 KB · Aufrufe: 370
  • Auswahl_238.png
    Auswahl_238.png
    39,5 KB · Aufrufe: 369
  • Auswahl_240.png
    Auswahl_240.png
    104,8 KB · Aufrufe: 371
In C++ muss in jedem cpp File alles inkluduert werden wass zur Übersetzung des Files nötig ist. In den header Files inkludiert man die Header welche nötig sind um die Klasse definieren. Nutzt du bsp. std::string in einer Methode de Klasse, brauchst du im Header "#include <string>"

Da du schon an solchen Sachen Problemen hast, vermute ich dass du noch recht "frisch" bist was C++ angeht. Um Abhängigkeiten zu reduzieren im Headerfile gibt es die sogenannte Compilerfirewall aka Pimpl Idiom.

https://www.heise.de/developer/artikel/C-Vor-und-Nachteile-des-d-Zeiger-Idioms-Teil-1-1097781.html
http://en.cppreference.com/w/cpp/language/pimpl

Im Zweifel hat immer der Compiler recht. Er sagt dir:"Nicht definierter Verweis auf ProxyServer::ProxyServer()". Das kann zwei dinge bedeuten: Du hast keinen DefaultConstructor oder du hast den Header nicht eingebunden. Da er auch auf die zweite Methode verweist, vermute ich dass du den Header nicht eingebunden hast oder über include guards die Einbindung fälschlicherweise hnterdrückt hast. Spich "include 'xyz'" wird gemacht aber der Inklude Guard wird zwei mal gesetzt. bsp.Copy Paste bei der Headererstellung.
 
DynamicServer lief fehlerfrei durch....
Das hat nicht unbedingt etwas zu bedeuten da die Link Reihenfolge anders sein kann und ld eben bei einem Fehler abbricht. Die Fehlermeldungen sind bei c++ manchesmal problematisch. Ich würde ein minimales main() machen und eine nach der anderen Klasse (wirklich step by step!) hinzufügen. Mit großer wahrscheinlichkeit machst du irgendwo einen dummen Fehler, der Compiler eher nicht...;)
 
So... Hab mal alle relevanten screenshots hochgeladen....
Im Zweifel hat immer der Compiler recht. Er sagt dir:"Nicht definierter Verweis auf ProxyServer::ProxyServer()". Das kann zwei dinge bedeuten: Du hast keinen DefaultConstructor oder du hast den Header nicht eingebunden.
also, wie du auf den Bildern erkenenn kannst, sind die Header dort eingebunden, wo sie benötigt werden.
Außerdem hat jede klasse ihren eigenen Default Construktor und Destruktor....
So, warum läuft aber der DynamicServer durch und verursacht KEINEN "nicht definierten Verweis auf DynamicServer::DynamicServer()" aber Proxy und StaticServer?
Wie du unscher auf den Screenshots erkennen kannst, sehen DynamicServer und StaticServer 100% gleich aus (bis auf die namensgebung halt).....

Wo zum geier ist da der fehler? :D
 

Anhänge

  • Auswahl_246.png
    Auswahl_246.png
    37,1 KB · Aufrufe: 362
  • Auswahl_245.png
    Auswahl_245.png
    40,6 KB · Aufrufe: 367
  • Auswahl_247.png
    Auswahl_247.png
    29,4 KB · Aufrufe: 361
  • Auswahl_248.png
    Auswahl_248.png
    125,1 KB · Aufrufe: 330
  • Auswahl_249.png
    Auswahl_249.png
    19,3 KB · Aufrufe: 303
  • Auswahl_250.png
    Auswahl_250.png
    22,6 KB · Aufrufe: 356
  • Auswahl_251.png
    Auswahl_251.png
    17,5 KB · Aufrufe: 357
  • Auswahl_252.png
    Auswahl_252.png
    20,2 KB · Aufrufe: 351
  • Auswahl_253.png
    Auswahl_253.png
    75,4 KB · Aufrufe: 360
  • Auswahl_254.png
    Auswahl_254.png
    19,2 KB · Aufrufe: 344
Ich würde ein minimales main() machen und eine nach der anderen Klasse (wirklich step by step!) hinzufügen.
jetzt verstehe ich gar nichts mehr....
xD
Grad nur die TestKlasseFuerServerVarianten.h eingebunden Static und ProxyServer in tryMyServer(); auskommentiert...
in main.cpp TestKlasse..... eingebunden... alles andere rausgekickt.... versucht zu kompilen...

jetzt bekomme ich die Meldung: Nicht definierter Verweis auf `nc::TestKlasseFuerServerVarianten::tryMyServer()'

[EDIT]
Hab nochmal ein Screenshot von der Projektmappe gemacht....
Und hab alle Includes rausgeschmissen und nur iostream und string includiert (In TestKlasse....)
Dann in main.cpp auch alles rausgeschmissen bis auf TestKlasse....
tryMyServer() alles rausgeschmissen und durch ein popeliges std::cout << "Hallo Welt" << std::endl; ersetzt.....

immernoch... nicht definierter Verweis....

[EDIT]
Sau dumm.... den Fehler von TestKlasse.... hab ich gefunden xD evtl sollte man auch TestKlasse.....;;tryMyServer(); schreiben ;)
Ich probiere jetzt nochmal aus die Server einzubinden....
 

Anhänge

  • Auswahl_256.png
    Auswahl_256.png
    48,9 KB · Aufrufe: 346
  • Auswahl_257.png
    Auswahl_257.png
    30,8 KB · Aufrufe: 368
  • Auswahl_259.png
    Auswahl_259.png
    63,7 KB · Aufrufe: 345
  • Auswahl_261.png
    Auswahl_261.png
    17,3 KB · Aufrufe: 322
Zuletzt bearbeitet:
Ok... bitte erschlagt mich.......
Ich hab die ganze zeit die falsche Bibliothek ins projekt hineinkopiert.....
Das wird vermutlich der Fehler gewesen sein...
 
Fehlersuche heiß ALLES zu eliminieren bis nur noch dein Fehler übrigbleibt. Wenn ich dich richtig verstehe verwendest du immer noch die alten Dateien. Auf mögliche Fehler hat dich schorsch_76 ja hingewiesen, vermutlich irgend etwas mit den Headern. Also: Neues Projekt mit main(), dann Basisklasse, dann 1. Derived (mit irgendeinem output), wenn Fehler, eliminieren, wenn OK 2. Derived etc pp. Kleine Schritte, keine namespaces, kein nix, step by step. Wenn das dann läuft kannst du es wieder step by step mit deinen Features auffüllen und in einen namespace packen. Was du brauchst ist zunächst immer ein funktionierender Rahmen.

Und nicht den Kopf hängen lassen, derartiges grhört zu den Anfängerfreuden in C++ (aber nicht nur da). Nach einger Zeit lacht man dann .über so etwas.:)
 
Ok... bitte erschlagt mich.......
Ich hab die ganze zeit die falsche Bibliothek ins projekt hineinkopiert.....
Take it easy, sowas nacht man nur einmal ... :):):)

PS: Schön ist es auch wenn man mit verschiedenen Varianten parallel arbeitet und plötzlich merkt das man auf der falschen Baustelle ist. Passiert mir immer wieder, - as blind as men can be! :rolleyes:
 
Und nicht den Kopf hängen lassen, derartiges grhört zu den Anfängerfreuden in C++ (aber nicht nur da). Nach einger Zeit lacht man dann .über so etwas.
xD dafür bin ich zu ehrgeizig....
Aber den Fehler hab ich gefunden.... Damit ich die Header der Bibliothek nutzen kann, muss ja auch die aktuelle vorkompilierte bibliothek zu den headern passen...
Und da war mein fehler..... (anscheinend...)
Denn ich hab statt die debug version die release version kopiert.... und die ist halt nicht so aktuell wie die debug version :D

FAIL! xD
 
Nein nein nein....
Da scheint noch irgendwo anders ein fehler zu sein......
Ich kann die isInstalled() immer noch nicht aufrufen....
Also habe ich isInstalled() auch noch in die Server.h geschrieben und in Server.cpp definiert....
Dachte vielleicht muss ja da auch was drin sein...

Aber nein... ich kann weder über ProxyServer nocht über Server die funktion isInstalled() aufrufen oO

Alle anderen Funktionen ja....

[EDIT]
SOOOO
hab jetzt die brachialmethode gewählt....
Alle Includes (Project Properties) rausgeschmissen....
Projekt nochmal gespeichert....
Eclipse neu gestartet....
Alle Includes zu den Properties hinzugefügt....
Bum läuft....

Frage dazu...
Muss man das immer so machen wenn man innerhalb der externen Bibliothek etwas verändert? das man die Includes in den Properties neu einlesen muss?
 
So gut bin ich dann doch noch nicht mit C++ vertraut das ich ohne IDE klar komme....
Klar son kleines mini progrämmchen was aus 2 3 kleinen klassen besteht.... Das bekomm ich auch noch hin.... :D
Aber hier grad.... da brauch ich schon eine IDE.... Und mit Eclipse komm ich bislang am besten zurecht....

Gut... dann geht die Frage mal an diejenigen raus die zufälligerweise auch Eclipse benutzen :D
 
Zurück
Oben