Problem mit vordefinierten Parametern/Attributen



  • Du musst den Standardparameter im Header angeben. Wenn der Compiler die Test.cpp kompiliert, weiß er ja nicht, dass du in einer gänzlich anderen .cpp einen Standardwert für den letzten Parameter angegeben hast. Er sieht ja nur den Header, in dem 3 Parameter verlangt werden und es keinen Standardwert gibt, so dass man mit 2 Parametern aufrufen könnte.



  • Habs jetzt mal so geändert:

    #ifndef DOUBLELINKEDLIST_H_
    #define DOUBLELINKEDLIST_H_
    
    #include "DoubleLinkedListElement.h"
    #include <iostream>
    
    using namespace std;
    
    class DoubleLinkedList
    {	
    	friend class DoubleLinkedListElement;
    	friend DoubleLinkedList operator+(const DoubleLinkedList&, const DoubleLinkedList&);
    
    	private:
    		unsigned int length;
    		DoubleLinkedListElement* head;
    		void init();
    	public:	
    		DoubleLinkedList();
    		DoubleLinkedList(const char**, unsigned int ,unsigned int );
    		DoubleLinkedList(const char**, unsigned int);
    		void push_back(const char*);
    		void push_front(const char*);
    		const char* pop_back();
    		const char* pop_front();
    		void insert(unsigned int,const char*);
    		void addArray(const char*[] ,unsigned int ,unsigned int);
    		void remove(unsigned int);
    		unsigned int getLength() const;
    		bool operator==(const DoubleLinkedList&) const;
    		bool operator!=(const DoubleLinkedList&) const;
    		DoubleLinkedList operator+=(const DoubleLinkedList&);
    		const char* operator[](unsigned int) const;
    		void print();
    };
    
    //#include "DoubleLinkedList.cpp"
    
    #endif /*DOUBLELINKEDLIST_H_*/
    

    aber trotzdem:

    make -k all 
    /usr/bin/g++ -Wall -o DoubleLinkedList Test.o DoubleLinkedList.o DoubleLinkedListElement.o
    Test.o: In function `main':
    Test.cpp:(.text+0xc9): undefined reference to `DoubleLinkedList::DoubleLinkedList(char const**, unsigned int)'
    collect2: ld gab 1 als Ende-Status zurück
    make: *** [all] Fehler 1
    


  • Ja, jetzt hast du DoubleLinkedList::DoubleLinkedList(char const**, unsigned int) hinzugefügt, also hat der Compiler nix zu meckern wenn er test.cpp kompiliert, aber wo hast du denn DoubleLinkedList::DoubleLinkedList(char const**, unsigned int) implementiert? Daran knabbert der Linker jetzt.

    Das einzige was ich die ganze Zeit doch sagen möchte ist, du hättest im HEADER stehen haben müssen:

    DoubleLinkedList(const char**, unsigned int ,unsigned int someval = 5 );

    Dann hättest du auch keine zusätzliche Funktion deklarieren müssen, weil der Compiler dann, während er test.cpp kompiliert, weiß, dass der letzte Parameter einen default-Wert besitzt und man die Funktion somit auch mit 2 Parametern aufrufen kann.

    Und überhaupt, im Header solltest du allen Parametern einen Namen geben, das macht es demjenigen einfacher, die Bibliothek zu benutzen, wenn er sich nur den Header (= Die Schnittstelle zu den Objekten) anschaut.



  • Dann kann ich das also nicht weglassen?

    Ich dachte, dass das der Sinn der vordefinierten Parameter ist.

    Muss ich also den Konstruktor komplett anlegen, oder kann ich den Aufruf umleiten?



  • Siehe oben, hab das nachträglich nochmal etwas verdeutlicht.



  • Also was es mitzunehmen gilt: Der Compiler sieht immer nur eine einzige .cpp datei und alles was diese datei #include'd hat. Der hat keine Ahnung davon, dass eine andere .cpp datei irgendwelche Standardparameter definiert. Der Linker ist dann dafür zuständig die ganzen Symbole zwischen mehreren "Units" (=.o-Dateien) aufzulösen und den Implementierungen (= Dem Maschinencode) zuzuordnen. Mal etwas vereinfacht ausgedrückt. Und da Standardparameter etwas sind, das auf Compilerebene wirkt, ergibt sich dein beobachtetes Problem.



  • OK:
    1. Hab ich jetzt alle Parameter mit Namen angegeben.
    2. Der Konstruktor lautet jetzt so:

    DoubleLinkedList(const char* elements[], unsigned int count,unsigned int offest = 0);
    

    Das hatte ich auch schonmal, aber es klappt nicht:

    make -k all 
    /usr/bin/g++ -Wall -c DoubleLinkedList.cpp
    DoubleLinkedList.cpp:15: Fehler: Standardargument für Parameter 3 von »DoubleLinkedList::DoubleLinkedList(const char**, unsigned int, unsigned int)« angegeben
    DoubleLinkedList.h:20: Fehler: nach vorheriger Spezifikation in »DoubleLinkedList::DoubleLinkedList(const char**, unsigned int, unsigned int)«
    make: *** [DoubleLinkedList.o] Fehler 1
    make: Das Target »all« wurde wegen Fehlern nicht aktualisiert
    


  • Naja, jetzt kannst du ja (rein logisch gesehen) und musst (dem C++-Standard nach) die Spezifikation eines Standardwertes für den 3. Parameter in der Implementierung weglassen.



  • Ariol schrieb:

    make -k all 
    ...
    DoubleLinkedList.cpp:15: Fehler: Standardargument für Parameter 3 von »DoubleLinkedList::DoubleLinkedList(const char**, unsigned int, unsigned int)« angegeben
    ...
    

    Lies mal bitte alle Postings nochmal durch.

    Standardparameter müssen ausschließlich in der Deklaration angegeben werden. Der Compiler sagt aber das du in der "DoubleLinkedList.cpp" (und ich wette dort in der Definition) einen Standardwert angegeben hast.



  • Sorry, falsche Ausgabe gepostet:
    hier die richtige:

    make -k all 
    /usr/bin/g++ -Wall -o DoubleLinkedList Test.o DoubleLinkedList.o DoubleLinkedListElement.o
    Test.o: In function `main':
    Test.cpp:(.text+0xc9): undefined reference to `DoubleLinkedList::DoubleLinkedList(char const**, unsigned int)'
    collect2: ld gab 1 als Ende-Status zurück
    make: *** [all] Fehler 1
    

    .............

    Ok, der Fehler war ein fehlendes "make clean".

    Mann, das hätte ich schon vorgestern haben können.

    Vielen Dank für eure Hilfe. 😉 Jetzt klappt alles 👍


Anmelden zum Antworten