[gelöst]Klassiker: multiple definition of `

Alles rund um die Programmierung mit Qt
Antworten
McMurphy
Beiträge: 4
Registriert: 29. Dezember 2008 16:42

[gelöst]Klassiker: multiple definition of `

Beitrag von McMurphy »

(wie das letzte mal) gleich vorweg: habe die forum-suche benutzt: soweit ich dazu fähig war, die entsprechenden hinweise ausgewertet und umgesetzt, leider kein positives ergebnis... (bin wahrscheinlich zu doof ;))

mein problem:

IAnInterface.h

Code: Alles auswählen

#ifndef IANINTERFACE_H
#define IANINTERFACE_H

class IAnInterface {

    public:
        virtual ~IAnInterface() {}

    public:
        virtual void doSomeMagic() =0;

};

#endif // IANINTERFACE_H
AnInterfaceImplementation.h

Code: Alles auswählen

#ifndef ANINTERFACEIMPLEMENTATION_H
#define ANINTERFACEIMPLEMENTATION_H

#include <QObject>

#include "IAnInterface.h"

class AnInterfaceImplementation : public IAnInterface {

    public:
        static IAnInterface* Instance () {

            static SyncRoot _SyncRoot;

            if (!_Instance)
                _Instance = new AnInterfaceImplementation();

            return _Instance;

        }

    private:
        static IAnInterface* _Instance;

        AnInterfaceImplementation();

        AnInterfaceImplementation(const AnInterfaceImplementation&);
        ~AnInterfaceImplementation(){ }

        class SyncRoot {
            public:
               ~SyncRoot() {
                  if(AnInterfaceImplementation::_Instance != NULL) {
                     delete AnInterfaceImplementation::_Instance;
                     AnInterfaceImplementation::_Instance = NULL;
                  }
               }
        };

    public:
        void doSomeMagic();

};

IAnInterface* AnInterfaceImplementation::_Instance = 0;

#endif // ANINTERFACEIMPLEMENTATION_H
AnInterfaceImplementation.cpp

Code: Alles auswählen

#include "AnInterfaceImplementation.h"

AnInterfaceImplementation::AnInterfaceImplementation(){
}

void AnInterfaceImplementation::doSomeMagic() {
    //
}
MainWindow.cpp

Code: Alles auswählen

#include "MainWindow.h"
#include "ui_MainWindow.h"

#include "IAnInterface.h"
#include "AnInterfaceImplementation.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    IAnInterface* anObject = AnInterfaceImplementation::Instance();

    anObject->doSomeMagic();

}

MainWindow::~MainWindow()
{
    delete ui;
}
ergebnis beim kompilieren ist:

Code: Alles auswählen

P:/Projects/Qt/Test_MultipleDefinition/Test_MultipleDefinition/IAnInterface.h::-1: error: multiple definition of `AnInterfaceImplementation::_Instance'

debug/MainWindow.o:P:/Projects/Qt/Test_MultipleDefinition/Test_MultipleDefinition/MainWindow.cpp::-1: error: first defined here
ide ist qt-creator... wahrscheinlich ein typisches bvk-problem.
Zuletzt geändert von McMurphy am 18. Dezember 2009 13:39, insgesamt 1-mal geändert.
[ja|nein|vielleicht]*
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Da Du AnInterfaceImplementation::_Instance im Header initiaisierst hast Du n multiple definitions. Je nachdem wie oft Du den Header in deinen Sourcen inkludierst. Bei Dir also zweimal.
Statische Variablen initialisert man deshalb immer in den Sourcen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
McMurphy
Beiträge: 4
Registriert: 29. Dezember 2008 16:42

Beitrag von McMurphy »

Brett vor'm Kopf billig abzugeben... (hab' noch 'ne menge davon)

damn... wie immer...

habe den gleichen ansatz in einem anderen projekt... dort meckert der compiler nicht. ich hatte diese loesung auch schon im kopf, aber es ergab für mich keinen sinn, warum es dann bei dem anderen ging.

:oops: dummy me

danke für die schnelle (und vor allen dingen hilfreiche) antwort. ich bemueh' mich, in zukunft spezielle qt-fragen zu stellen ;)

PS (für alle, die die antwort nicht ganz verstehen):

Code: Alles auswählen

IAnInterface* AnInterfaceImplementation::_Instance = 0;
ist in der datei AnInterfaceImplementation.cpp besser aufgehoben...

Code: Alles auswählen

#include "AnInterfaceImplementation.h"

IAnInterface* AnInterfaceImplementation::_Instance = 0;

AnInterfaceImplementation::AnInterfaceImplementation(){
}

void AnInterfaceImplementation::doSomeMagic() {
    //
}
[ja|nein|vielleicht]*
Antworten