Deklariert oder nicht deklariert?

  • 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?

  • 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..

    640K ought to be enough for anybody. :eek2:

  • Naja, das wär die Headerdatei:

    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;


    ;)

  • 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

    Four stages of acceptance:
    1.) this is worthless nonsense
    2.) this is interesting, but perverse, point of view
    3.) this is true, but quite unimportant
    4.) I alwas said so
    J.B.S. Haldane

  • 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.

    '100 little bugs in the code, 100 bugs in the code. Fix one bug, compile it again: 101 little bugs in the code.
    101 little bugs in the code . . .'
    Continue until 0 Bugs reached...

  • 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.

    "Egbert B. Gebstadter is the Egbert B. Gebstadter of indirect self-reference." - Egbert B. Gebstadter

  • 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...

    Dipper dipper dii dipper dii dipper dii duuu

  • 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?

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!