statische varaible in Interface

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

statische varaible in Interface

Beitrag 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?
Zuletzt geändert von anno1988 am 25. Februar 2011 21:41, insgesamt 1-mal geändert.
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag 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?
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
Antworten