Beginner Fragen



  • Hi,

    Ich bin recht neu in C++ und habe davor in Java programmiert. Nun bin ich auf 2 Fragen gestoßen.
    1. Wann sollte man einen Zeiger und wann eine normale Variable benutzen?

    2. Ich arbeite mit QT, nun habe ich mir eine Klasse Contact und eine Klase Contactmanager erstellt.

    #ifndef CONTACT_H
    #define CONTACT_H
    
    #include <QString>
    
    class Contact
    {
    public:
        Contact(QString firstname, QString name, int plz, QString address, QString phonenumber1, QString phonenumber2, QString mobilenumber1, QString mobilenumber2);
    public:
        void setFirstname(QString);
        void setName(QString);
        void setPlz(int);
        void setAddress(QString);
        void setPhonenumber1(QString);
        void setPhonenumber2(QString);
        void setMobilenumber1(QString);
        void setMobilenumber2(QString);
    
        QString getFirstname();
        QString getName();
        int getPlz();
        QString getAddress();
        QString getPhonenumber1();
        QString getPhonenumber2();
        QString getMobilenumber1();
        QString getMobilenumber2();
    
    private:
        QString firstname;
        QString name;
        int plz;
        QString address;
        QString phonenumber1;
        QString phonenumber2;
        QString mobilenumber1;
        QString mobilenumber2;
    };
    
    #endif // CONTACT_H
    
    #include "contact.h"
    
    Contact::Contact(QString firstname, QString name, int plz, QString address, QString phonenumber1, QString phonenumber2, QString mobilenumber1, QString mobilenumber2)
    {
        this->firstname = firstname;
        this->name = name;
        this->plz = plz;
        this->address = address;
        this->phonenumber1 = phonenumber1;
        this->phonenumber2 = phonenumber2;
        this->mobilenumber1 = mobilenumber1;
        this->mobilenumber2 = mobilenumber2;
    }
    
    void Contact::setFirstname(QString a)
    {
        this->firstname = firstname;
    }
    
    void Contact::setName(QString name)
    {
        this->name = name;
    }
    
    void Contact::setPlz(int plz)
    {
        this->plz = plz;
    }
    
    void Contact::setAddress(QString address)
    {
        this->address = address;
    }
    
    void Contact::setPhonenumber1(QString phonenumber1)
    {
        this->phonenumber1 = phonenumber1;
    }
    
    void Contact::setPhonenumber2(QString phonenumber2)
    {
        this->phonenumber2 = phonenumber2;
    }
    
    void Contact::setMobilenumber1(QString mobilenumber1)
    {
        this->mobilenumber1 = mobilenumber1;
    }
    
    void Contact::setMobilenumber2(QString mobilenumber2)
    {
        this->mobilenumber2 = mobilenumber2;
    }
    
    QString Contact::getFirstname()
    {
        return this->firstname;
    }
    
    int Contact::getPlz()
    {
        return this->plz;
    }
    
    #ifndef CONTACTMANAGER_H
    #define CONTACTMANAGER_H
    
    #include <QList>
    #include <contact.h>
    
    class ContactManager
    {
    public:
        static ContactManager* getInstance();
        void add(Contact);
        void remove(Contact);
        Contact contains(Contact);
    
    private:
        ContactManager();
        static ContactManager* theContactManager;
        QList <Contact> contactlist;
    };
    
    #endif // CONTACTMANAGER_H
    
    #include "contactmanager.h"
    #include "contact.h"
    #include <iostream>
    
    ContactManager* ContactManager::theContactManager = NULL;
    
    ContactManager::ContactManager()
    {
    }
    
    ContactManager* ContactManager::getInstance()
    {
        if(theContactManager == NULL)
            theContactManager = new ContactManager();
        return theContactManager;
    }
    
    void ContactManager::add(Contact c)
    {
        contactlist << c;
    
    }
    
    void ContactManager::remove(Contact c)
    {
    }
    
    Contact ContactManager::contains(Contact c)
    {
        int b = contactlist.indexOf(c);
        return contactlist.at(b);
    }
    

    Die Funktion contains klappt aber nicht.
    Fehlermeldung

    d:\programme\qt\desktop\qt\4.8.0\msvc2010\include\qtcore\qlist.h:855: Fehler:C2678: Bin„rer Operator '==': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'Contact' akzeptiert (oder keine geeignete Konvertierung m”glich)
    d:\Programme\QT\Desktop\Qt\4.8.0\msvc2010\include\QtCore/qglobal.h(1986): kann 'bool operator ==(QBool,bool)' sein
    d:\Programme\QT\Desktop\Qt\4.8.0\msvc2010\include\QtCore/qglobal.h(1987): oder "bool operator ==(bool,QBool)"
    d:\Programme\QT\Desktop\Qt\4.8.0\msvc2010\include\QtCore/qglobal.h(1988): oder "bool operator ==(QBool,QBool)"
    d:\Programme\QT\Desktop\Qt\4.8.0\msvc2010\include\QtCore/qchar.h(388): oder "bool operator ==(QChar,QChar)"
    d:\Programme\QT\Desktop\Qt\4.8.0\msvc2010\include\QtCore/qbytearray.h(527): oder "bool operator ==(const QByteArray &,const QByteArray &)"
    d:\Programme\QT\Desktop\Qt\4.8.0\msvc2010\include\QtCore/qbytearray.h(529): oder "bool operator ==(const QByteArray &,const char *)"
    d:\Programme\QT\Desktop\Qt\4.8.0\msvc2010\include\QtCore/qbytearray.h(531): oder "bool operator ==(const char *,const QByteArray &)"
    d:\programme\qt\desktop\qt\4.8.0\msvc2010\include\qtcore\qstring.h(908): oder "bool operator ==(QString::Null,QString::Null)"
    d:\programme\qt\desktop\qt\4.8.0\msvc2010\include\qtcore\qstring.h(909): oder "bool operator ==(QString::Null,const QString &)"
    d:\programme\qt\desktop\qt\4.8.0\msvc2010\include\qtcore\qstring.h(910): oder "bool operator ==(const QString &,QString::Null)"
    d:\programme\qt\desktop\qt\4.8.0\msvc2010\include\qtcore\qstring.h(936): oder "bool operator ==(const char *,const QString &)"
    d:\programme\qt\desktop\qt\4.8.0\msvc2010\include\qtcore\qstring.h(949): oder "bool operator ==(const char *,const QLatin1String &)"
    d:\programme\qt\desktop\qt\4.8.0\msvc2010\include\qtcore\qstring.h(962): oder "bool operator ==(const QLatin1String &,const QLatin1String &)"
    d:\programme\qt\desktop\qt\4.8.0\msvc2010\include\qtcore\qstring.h(1202): oder "bool operator ==(const QStringRef &,const QStringRef &)"
    d:\programme\qt\desktop\qt\4.8.0\msvc2010\include\qtcore\qstring.h(1205): oder "bool operator ==(const QString &,const QStringRef &)"
    d:\programme\qt\desktop\qt\4.8.0\msvc2010\include\qtcore\qstring.h(1208): oder "bool operator ==(const QStringRef &,const QString &)"
    d:\programme\qt\desktop\qt\4.8.0\msvc2010\include\qtcore\qstring.h(1212): oder "bool operator ==(const QLatin1String &,const QStringRef &)"
    d:\programme\qt\desktop\qt\4.8.0\msvc2010\include\qtcore\qstring.h(1215): oder "bool operator ==(const QStringRef &,const QLatin1String &)"
    d:\programme\qt\desktop\qt\4.8.0\msvc2010\include\qtcore\qstring.h(1236): oder "bool operator ==(const char *,const QStringRef &)"
    d:\programme\qt\desktop\qt\4.8.0\msvc2010\include\qtcore\qstring.h(1238): oder "bool operator ==(const QStringRef &,const char *)"
    bei Anpassung der Argumentliste '(Contact, const Contact)'
    d:\programme\qt\desktop\qt\4.8.0\msvc2010\include\qtcore\qlist.h(848): Bei der Kompilierung der Klassen-template der int QList<T>::indexOf(const T &,int) const-Memberfunktion
    with
    [
    T=Contact
    ]
    c:\users\franz\adressbook\contactmanager.h(18): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "QList<T>".
    with
    [
    T=Contact
    ]

    Diese Fehlermeldung bekomm ich öfters was ist der Fehler?


  • Mod

    devilx schrieb:

    1. Wann sollte man einen Zeiger und wann eine normale Variable benutzen?

    Fausregel: Pointer nur, wenn du sie wirklich unbedingt brauchst. Was fast nie der Fall ist, wenn du die Standardbibliothek gründlich nutzt, die fast alles was man so täglich an komplexen Datenstrukturen (und damit Pointern) so braucht schon fertig anbietet. Und selbst wenn du Pointer wirklich brauchst, ist meistens ein Smartpointer (ebenfalls Standardbibliothek, in C++11 auch mit mehr Auswal oder in Boost oder schnell selber programmiert) eine passendere Wahl. Oder eine Referenz, wenn es um Funktionsargumente geht. Den klassischen nackten Pointer braucht man in C++ sehr sehr selten.

    Zu 2.
    Ich ahne zwar was, aber da Qt oftmals Sachen sehr ungewöhnlich nach C++-Maßstäben handhabt, verschiebe ich dich besser mal.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Andere GUIs - Qt, GTK+, wxWidgets verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo,

    Der Fehler entsteht durch Anwendung der Funktion indexOf auf die contactlist. Damit indexOf funktionieren kann benötigt sie einen Vergleichsoperator. Du hast aber bei der Klasse Contact keinen definiert. Mach es und es wird funktionieren.
    Zu Operatorüberladung gibt es im Magazin einen schönen Beitrag.



  • Danke, das hat geklappt! Nun bin ich aber vor einem neuen Problem, welches zwar nicht in die Sektion passt aber ich wollte keinen neuen Thread aufmachen.

    void Datasource::add(Contact c)
    {
        if(db.isOpen())
        {
            QSqlQuery query;
            query.prepare("INSERT INTO contacts (id, firstname, name, plz, address, phonenumber1, phonenumber2, mobilenumber1, mobilenumber2) VALUES (:id, :firstname, :name, :plz, :address, :phonenumber1, :phonenumber2, :mobilenumber1, :mobilenumber2)");
            query.bindValue(":id", c.getId());
            query.bindValue(":firstname",c.getFirstname());
            query.bindValue(":name",c.getName());
            query.bindValue(":plz",c.getPlz());
            query.bindValue(":address",c.getAddress());
            query.bindValue(":phonenumber1",c.getPhonenumber1());
            query.bindValue(":phonenumber2",c.getPhonenumber2());
            query.bindValue(":mobilenumber1",c.getMobilenumber1());
            query.bindValue(":mobilenumber2",c.getMobilenumber2());
            query.exec();
        }
    }
    

    void Datasource::add(Contact c)
    {
    if(db.isOpen())
    {
    QSqlQuery query;
    query.prepare("INSERT INTO contacts (id, firstname, name, plz, address, phonenumber1, phonenumber2, mobilenumber1, mobilenumber2) VALUES (:id, :firstname, :name, :plz, :address, :phonenumber1, :phonenumber2, :mobilenumber1, :mobilenumber2)");
    query.bindValue(":id", c.getId());
    query.bindValue(":firstname",c.getFirstname());
    query.bindValue(":name",c.getName());
    query.bindValue(":plz",c.getPlz());
    query.bindValue(":address",c.getAddress());
    query.bindValue(":phonenumber1",c.getPhonenumber1());
    query.bindValue(":phonenumber2",c.getPhonenumber2());
    query.bindValue(":mobilenumber1",c.getMobilenumber1());
    query.bindValue(":mobilenumber2",c.getMobilenumber2());
    query.exec();
    }
    }[/cpp]

    #ifndef DATASOURCE_H
    #define DATASOURCE_H
    
    #include <contact.h>
    #include <QtSql/QSqlDatabase>
    #include <QtSql/QSqlError>
    #include <QtSql/QSqlQuery>
    #include <QVariant>
    #include <QString>
    
    class Datasource
        {
        public:
            Datasource();
    
        public:
            void add(Contact);
            void remove(Contact);
    
        private:
            QSqlDatabase db;
            bool openDB();
            bool createTables();
        };
    
    #endif // DATASOURCE_H
    

    Ich versteh diesen Fehler einfach nicht

    datasource.obj👎 Fehler:LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: class QString __thiscall Contact::getMobilenumber2(void)" (?getMobilenumber2@Contact@@QAE?AVQString@@XZ)" in Funktion ""public: void __thiscall Datasource::add(class Contact)" (?add@Datasource@@QAEXVContact@@@Z)".



  • devilx schrieb:

    Ich versteh diesen Fehler einfach nicht

    datasource.obj👎 Fehler:LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: class QString __thiscall Contact::getMobilenumber2(void)" (?getMobilenumber2@Contact@@QAE?AVQString@@XZ)" in Funktion ""public: void __thiscall Datasource::add(class Contact)" (?add@Datasource@@QAEXVContact@@@Z)".

    Der Fehler sagt dir, dass der Linker die Methode "QString Contact::getMobilenumber2() nicht findet. Kann es sein, dass du dise Methode nur im Header definiert aber nicht in der entsprechenden cpp Datei implementiert hast?


Anmelden zum Antworten