Problemmeldeung: Kein geeigneter Standartkonstruktor



  • 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