Problemmeldeung: Kein geeigneter Standartkonstruktor



  • Wenn du die ganze Fehlermeldung gepostet hättest, hätte man dir mehrere Sachen sagen können:
    😉 Sequence hat keinen Standardkonstruktor, der aber benötigt wird für den dein "IntList is;" - außer du initialisierst das Objekt ordentlich via Initialisierungsliste im Konstruktor von IntSet.
    😉 is ist kein Zeigertyp, weshalb dein "is->seq = new int[s];" im IntSet-Konstruktor falsch ist. Wäre mit erstem Punkt korrekt gelöst eh nicht notwendig 😉

    BTW.: Das "friend class IntSet;" im Sequence stammt von dir, oder? Kann mir nicht so ganz denken, dass das vom Prof mitgegegeben wurde.



  • "is->seq = new int[s];" ja ist ein schreibfehler, habe ich bemerkt.

    "friend class IntSet;" ja das stammt von mir, aber ich brauche es so, oder nicht?^^

    aber irgendwie bekomme ich das nicht hin mit dem Konstruktor 😞



  • kasax_a schrieb:

    "friend class IntSet;" ja das stammt von mir, aber ich brauche es so, oder nicht?^^

    Nein, brauchst du nicht. Du kannst dich ja nicht einfach so in fremde Klassen eintragen...

    aber irgendwie bekomme ich das nicht hin mit dem Konstruktor 😞

    Hab ich auch geschrieben: Initialisierungsliste. Wenn du verhindern willst, dass für Basisklassen- oder Elementinitialisierung nicht der Standardkonstruktor verwendet werden soll, musst du das dort erledigen, in deinem Fall ist das die einzige Möglichkeit.
    Und um das "Wo" nochmal hervoruiheben: Bei der Konstruktordefinition von IntSet.



  • soo....ok habe jetzt verändert:

    Intset.h
    
    #ifndef INTSET_H
    #define INTSET_H
    
    #include "subject.h"
    #include "sequence.h"
    
    typedef Sequence<int> IntList;
    
    class IntSet:public Subject
    {
            IntList is;
        public:
            //Kein Konstruktor//
            bool insertElement(int element);
            bool removeElement(int element);
            unsigned size();
    
            friend class SetIterator;
            friend class MaxObserver;
            friend class MinObserver;
    }; 
    [...]
    
    Sequence.h
    
    #ifndef SEQUENCE_H
    #define SEQUENCE_H
    
    //   Uebung 10.1 Sequentielle Liste
    //   Datei sequence.h
    
    #pragma warning( disable : 4290)  // throw Anweisung
    
    // Exception-Klasse
    class InvalidIndex { };
    
    template<class AD> // AD Typ für Nutzdaten (Application Data)
    class Sequence  {
      AD *seq;        // Speicherplatz
      unsigned max;   // maximale Länge
      unsigned len;   // aktuelle Länge
      class Iter;
    public:
      Sequence();  //KEINE PARAMETER//
      ~Sequence(void); 
    [...]
    };
    template<class AD>
    inline Sequence<AD>::Sequence()  //KEINE PARAMETER//
    {
        max = 10;
        seq = new AD[max];
        len = 0;
    }
    

    Nun läuft das Programm, bricht aber ab, sobald sich Minimum und/oder Maximum ändert.



  • DU LIEST NICHT, WAS ICH SCHREIBE!
    Such doch wenigstens mal nach Initialisierungsliste...
    Du veränderst zum wiederholten Male einen Header, der dich NICHTS ANGEHT! Sequence wurde dir bereitgestellt zur Hilfe, und nicht um darin rumzupfuschen!

    Einfach ein kleines Beispiel dazu, wie so eine Elementinitialisierung via Initialisierungsliste ausschaut:

    class Test {
        int member;
        std::string name;
    public:
        Test( int val, const std::string& name );
    };
    
    Test::Test( int val, const std::string& nm )
     : member(val),  // Elementinitialisierer
       name(nm)      // Elementinitialisierer für ne Klasse
    {}
    


  • doch ich lese schon, aber wenn ich über die Initialisierungsliste mache, dann kommt es, dass es kein Standartkonstruktor verfügbar ist.



  • kasax_a schrieb:

    doch ich lese schon, aber wenn ich über die Initialisierungsliste mache, dann kommt es, dass es kein Standartkonstruktor verfügbar ist.

    Zeig bitte den Code, ich kann mir nicht vorstellen, dass du den da hingebastelt hast, wo er hin soll 😉
    Und die zugehörige KOMPLETTE Fehlermeldung bitte auch.



  • ok hier der Code...Sequence.h habe ich jetzt unverändert gelassen..

    fehlermeldung: Fehler 1 error C2512: 'IntSet': Kein geeigneter Standardkonstruktor verfügbar c:\users\user\documents\visual studio 2008\projects\testat\testat\main.cpp 10 Testat

    #ifndef INTSET_H
    #define INTSET_H
    
    #include "subject.h"
    #include "sequence.h"
    
    typedef Sequence<int> IntList;
    
    class IntSet:public Subject
    {
            IntList is;
        public:
            IntSet(IntList s);
            bool insertElement(int element);
            bool removeElement(int element);
            unsigned size();
    
            friend class SetIterator;
            friend class MaxObserver;
            friend class MinObserver;
    };
    
    IntSet::IntSet(IntList s):is(s)
    {
    }
    
    [...]
    


  • class IntSet:public Subject
    {
            IntList is;
        public:
            IntSet(const IntList& s);
            bool insertElement(int element);
            bool removeElement(int element);
            unsigned size();
    
            friend class SetIterator;
            friend class MaxObserver;
            friend class MinObserver;
    };
    
    IntSet::IntSet(const IntList& s):is(s)
    {
    }
    

    Jetzt die Quizfrage: Warum geht das so und wie vorher nicht?

    //EDTI:
    Ok, Typen nicht gesehen. IntSet != IntList. 🙂



  • mhh...ändert sich aber gar nix dran....immer noch die selbe fehlermeldung 😞



  • GRRR, wie hat dein Konstruktor vorher ausgeschaut?
    IntSet(), das ist die Signatur eines Standardkosntruktor. Im Konstruktor hast du dann versucht, die Größe der IntList zu ändern, auf 10 (an allen Funktionen von IntList vorbei).
    Die erwartete Lösung sähe dann so aus:

    IntSet::IntSet()
     : is(10)
    {}
    

    Der Fehler den du jetzt produzierst, rührt daher dass IntSet keinen Standardkonstruktor mehr hat, das "IntSet is;" in der main() löst ihn aus.



  • ok...habe es so gemacht, aber jetzt kommt diese fehlermeldungen:

    1: Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Subject::Subject(void)" (??0Subject@@QAE@XZ)" in Funktion ""public: __thiscall IntSet::IntSet(void)" (??0IntSet@@QAE@XZ)". main.obj Testat

    2: Fehler 2 fatal error LNK1120: 1 nicht aufgelöste externe Verweise. C:\Users\user\Documents\Visual Studio 2008\Projects\Testat\Debug\Testat.exe Testat



  • Es gab in Subject das selbe Problem wie in IntSet, diesmal mit obs. Ich nehme an, du hast versucht dem Problem aus dem Weg zu gehen und hast die Konstruktordefinition gelöscht 😛
    Oder die Implementierung liegt in einer anderen Datei, die nicht mitkompiliert wurde. Jedenfalls ist das kein Compiler-Problem mehr, sondern ein Linkerfehler.



  • japp....habe ich bemerkt und habe jetzt so gemacht:

    ...
        public:
            Subject();
            void attach(Observer *observer);
            void detach(Observer *observer);
            void notify();
    
    };
    
    Subject::Subject():obs(0)
    {
    
    }
    
    ...
    

    das programm läuft, aber nicht ganz richtig....es zeigt MaxObserve und MinObserve nicht an...und wenn ich die "4" zum exit drücke passiert auch nix.



  • Tjo, dann musst du jetzt die nächste Hürde zum fertigen Programm meistern: Debuggen.
    Unter Linux/Mingw nimmst du den gdb, unter VS gibt es sicher auch einen debugger. Verwendung wird in der jeweiligen Doku oder auf diversen Internetseiten in Tutorials oder anderen Foren zur Genüge diskutiert 😉



  • ich kriegs echt nicht hin

    hier ist der Code von MaxObserver und Min Observer

    #ifndef MINOBSERVER_H
    #define MINOBSERVER_H
    
    #include "intset.h"
    #include "sequence.h"
    #include <iostream>
    
    using namespace std;
    
    class MinObserver:public Observer
    {
            IntSet *intset;
            int min;
            bool a;
        public:
            MinObserver(IntSet *is);
            ~MinObserver();
            void update();
    };
    
    MinObserver::MinObserver(IntSet *is):intset(is), a(false)
    {
        intset->attach(this);
        update();
    }
    
    MinObserver::~MinObserver()
    {
        intset->detach(this);
        intset = NULL;
    }
    
    void MinObserver::update()
    {
        for(unsigned i=0; i<intset->size(); i++)
            if(intset->is.operator [](i) < min)
    		{
    			min=intset->is.operator [](i);
                cout << "MinObserver changed to: " << min << endl;
    		}
    }
    
    #ifndef MAXOBSERVER_H
    #define MAXOBSERVER_H
    
    #include "intset.h"
    #include "sequence.h"
    #include <iostream>
    
    using namespace std;
    
    class MaxObserver:public Observer
    {
            IntSet *intset;
            int max;
            bool a;
        public:
            MaxObserver(IntSet *is);
            ~MaxObserver();
            void update();
    };
    
    MaxObserver::MaxObserver(IntSet *is):intset(is), a(false)
    {
        intset->attach(this);
        update();
    }
    
    MaxObserver::~MaxObserver()
    {
        intset->detach(this);
        intset = NULL;
    }
    
    void MaxObserver::update()
    {
        for(unsigned i=0; i<intset->size(); i++)
            if(intset->is.operator [](i) > max)
    		{
                max=intset->is.operator [](i);
    			a = true;
                cout << "MaxObserver changed to: " << max << endl;
    		}
    }
    
    #endif
    

    wie passe ich das jetzt auf meine Sequence.h an?
    das er dann auch die werte aus gibt?


Anmelden zum Antworten