Seite 1 von 1

statische varaible in Interface

Verfasst: 25. Februar 2011 11:50
von anno1988
Hallo,

ich will in meinem Plugin eine statische öffentliche Variable benutzen.

die Deklaration im Plugin funktioniert soweit nur das Ansprechen der variable nicht so ganz nach dem laden des Plugins.

Interface:

Code: Alles auswählen


#include <QString>


class MyInterface {
  public:
    static const QString Wert1;

}

Plugin:

Code: Alles auswählen

class  MyPlugin : public MyInterface {

  Q_OBJECT

  Q_INTERFACES(MyInterface);

  public:
    static const QString Wert1;
}

im Programm:

Code: Alles auswählen


QPluginLoader plugin_loader;

MyInterface *my_interface;


plugin_loader.setFileName("lib.so");

  if(plugin_loader.load() == true) {

    my_interface = qobject_cast<My_Interface*>(plugin_loader.instance());


    if(my_interface != NULL) {

      QString test = my_interface->Wert1;

    }
}

Hier bekomme ich aber schon einen Compiler Fehler:
"undefined referance to My_Interface::Wert1"


Wie genau muss ich denn die Klassenvariable ansprechen?

Verfasst: 25. Februar 2011 13:25
von pfid
Irgendwo in fehlt ein

Code: Alles auswählen

const QString MyInterface::Wert1;
order

Code: Alles auswählen

const QString MyInterface::Wert1 = "Foobar";
-> C++ Grundlagen.

Btw: Wieso hast du die gleiche Variable in der abgeleiteten Klasse nochmal?

Verfasst: 25. Februar 2011 14:18
von anno1988
pfid hat geschrieben: Btw: Wieso hast du die gleiche Variable in der abgeleiteten Klasse nochmal?
sonst bekomme ich folgende Fehlermeldung vom Compiler:

Code: Alles auswählen

ISO C++ does not permit ‘MyInterface::Wert1’ to be defined as ‘MyPlugin::Wert1
Noch was:

Das Problem liegt hier nicht an einem fehlenden

Code: Alles auswählen

const QString MyInterface::Wert1 = "Foobar"; 
Code in der Source Datei. Sonst hätte ich es ja nicht compilieren können.

Der statischen variable habe ich ja einen Wert zugewiesen.


Nur eben der Aufruf im Programm beim Laden der Instanz bekomme ich nicht hin.

Verfasst: 25. Februar 2011 15:05
von franzf
Und wo soll die undefined reference sonst noch herkommen? Das ist BTW. kein Laufzeitfehler, das Problem tritt bereits zur Buildtime auf, genauer: der Linker findet beim Linken deiner Object-Dateien ein Symbol nicht. Nach deiner angedeuteten Fehlermeldung (es fehlt die Stelle, wo der Linker das Problem feststellt, das wäre noch interessant) ist das fehlende Symbol "My_Interface::Wert1".

Wenn du das in einer Implementierungsdatei (.cpp, .cxx, ...) hast musst du natürlich diese Datei auch kompilieren und irgendwie mitlinken. Am besten packst du die Object-Datei in eine eigene Lib, die dann alle Plugins mitlinken müssen.
Da das ein reines C++-Problem ist, verschieb ich den Thread mal in die Richtung.