Seite 1 von 1

[gelöst]Klassiker: multiple definition of `

Verfasst: 18. Dezember 2009 10:32
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.

Verfasst: 18. Dezember 2009 11:39
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.

Verfasst: 18. Dezember 2009 12:04
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() {
    //
}