1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Deklariert oder nicht deklariert?

  • escitalopram
  • 9. März 2006 um 19:28
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • escitalopram
    Punkte
    105
    Beiträge
    16
    • 9. März 2006 um 19:28
    • #1

    Hi.
    Ich arbeite gerade an einem etwas größeren C++-Projekt und bei mir treten seltsame Phänomene auf; zunächst mal war da ein Problem, dass der compiler (g++) eine deklarierte Klasse nicht gefunden hat, obwohl der Header eingebunden war. Die Lösung für dieses Problem habe ich schon gefunden, und zwar war in ein paar Headern nach dem namespace Y {...} ein Strichpunkt, der wegmusste.

    Jetzt hab ich ein ähnliches Problem:
    Ich hab eine Klasse ShaderManager mit einem Konstruktor ShaderManager(Karl x). Wenn ich diesen Konstruktor nun aber verwenden will, meldet mir g++ es gäbe keinen derartigen Konstruktor, sondern nur den Default- und den Kopierkonstruktor. (Wenn ich das richtig verstanden habe, sollten beide nicht mehr vorhanden sein, wenn ich einen anderen Konstruktor definiert hab....?) Wie kann es sein, dass eine Klassendefinition vom Compiler akzeptiert wird, dieser aber den Konstruktor trotzdem ignoriert?

  • Swoncen
    Punkte
    5.331
    Beiträge
    993
    • 9. März 2006 um 19:31
    • #2

    den Default Konstruktor gibts meines Wissens immer, wenn du keinen Konstruktor ohne Parameter schreibst. Vielleicht kannst du einmal kleine Programmausschnitte zeigen wo der Fehler passiert..

  • escitalopram
    Punkte
    105
    Beiträge
    16
    • 9. März 2006 um 20:24
    • #3

    Naja, das wär die Headerdatei:

    Code
    namespace Tuft  {
    
    
    	class ShaderManager
    {
    public:
    	ShaderManager(boost::shared_ptr<FileManager> source_);
    	~ShaderManager();
    [...]
    };
    
    
    }
    Alles anzeigen

    und die Klasse verwende ich folgendermaßen:

    Code
    using namespace Tuft;
    int main(int argc, char* argv[]) {
    	boost::shared_ptr<FileManager> fm(new FileManager());
    	ShaderManager sm(fm);
    [...]

    Die Fehlermeldung sieht dann so aus:

    Code
    BspTest.cc: In function `int main(int, char**)':
    BspTest.cc:8: Fehler: keine passende Funktion für Aufruf von »Tuft::ShaderManager::ShaderManager(boost::shared_ptr<Tuft::FileManager>&)«
    TuftBsp.h:22: Anmerkung: Kandidaten sind: Tuft::ShaderManager::ShaderManager()
    TuftBsp.h:22: Anmerkung:                  Tuft::ShaderManager::ShaderManager(const Tuft::ShaderManager&)


    achja, und natürlich

    Code
    typedef boost::shared_ptr<FileManager> Karl;


    ;)

  • KeinWunder
    Punkte
    490
    Beiträge
    90
    • 9. März 2006 um 20:26
    • #4

    hast du vielleicht einen Rückgabewert angegeben?
    dann wird nämlich dein "Konstruktor" als normale Methode behandelt.

    Edit: hab das obere posting noch nicht gesehen gehabt

  • Swoncen
    Punkte
    5.331
    Beiträge
    993
    • 9. März 2006 um 20:39
    • #5

    Was hällt dich von

    Zitat

    ShaderManager sm = new ShaderManger(fm);


    ab?

  • escitalopram
    Punkte
    105
    Beiträge
    16
    • 9. März 2006 um 20:57
    • #6

    Das ändert auch nichts... Findet den Konstruktor auch nicht.
    Und davon abgesehen, gibt new nicht ein ShaderManager* zurück?

  • stormcrow
    Punkte
    360
    Beiträge
    72
    • 9. März 2006 um 21:16
    • #7

    ja, bei new mit *

  • escitalopram
    Punkte
    105
    Beiträge
    16
    • 9. März 2006 um 22:23
    • #8

    Gottes willen, ich hab da grad was rausgefunden

    Wenn ich die g++ Compilerflags "-ansi" und "-pedantic" verwende, dann kompiliert das Zeug.... SEHR seltsam ist das...

  • Swoncen
    Punkte
    5.331
    Beiträge
    993
    • 9. März 2006 um 22:27
    • #9

    War ja klar, dass es sowas ist...

  • Soulmerge
    Punkte
    405
    Beiträge
    71
    • 13. März 2006 um 14:08
    • #10
    Zitat von Swoncen

    den Default Konstruktor gibts meines Wissens immer, wenn du keinen Konstruktor ohne Parameter schreibst.


    Der Kopierkonstruktor existiert auch, wenn man ihn nicht definiert, der default-Konstruktor wird aber nur vom Compiler hinzugefügt, sofern kein anderer nicht-kopier-Konstruktor deklariert wurde.

  • J.Petso
    Punkte
    2.384
    Beiträge
    457
    • 13. März 2006 um 21:28
    • #11

    Blödsinn. Alles, was ich vorher grad geschrieben hatte, ist falsch.
    Zurzeit tippe ich deshalb darauf, dass er deinen Konstruktor aus irgendeinem Grund gar nicht erkennt, weil er ihn nicht in der Liste der Alternativen anführt. (Frag mich nicht warum.)

    edit: Dein Beispiel kompiliert übrigens bei mir, mit der einzigen Änderung, dass ich FileManager durch std::string ersetzt hab.

  • sauzachn
    Punkte
    3.101
    Beiträge
    606
    • 13. März 2006 um 21:52
    • #12

    Muss der Kopierkonstruktor als Argument nicht eine (evt. const) _Referenz_ bekommen (C++Standard 12.1 §10)? Du übergibst, so weit ich das sehe, nur einen Wert.

    EDIT: Stimmt zwar, hat aber mit der Sache gar nix zu tun. Sollte genauer lesen...

  • hal
    Punkte
    11.122
    Beiträge
    2.208
    • 14. März 2006 um 08:19
    • #13

    Mein Gefühl sagt mir, dass der Fehler außerhalb dieses Codebeispiels liegt. Evtl wird einfach diese Klassendeklaration ausge-#ifdef'd oder sowas in der Art?

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum