2016-07-27 39 views
-1

您好,我知道另一篇有關鏈接errorr和static關鍵字在C++中,但我認爲我所做的一切都是正確的從靜態函數原因鏈接錯誤返回靜態列表

我宣佈和PluginCollection.h

定義我的功能
#ifndef PLUGINCOLLECTION_H 
#define PLUGINCOLLECTION_H 

#include <QList> 
#include "PluginA.h" //this include Plugin.h 


namespace PluginCollection 
{ 
    static QList<Plugin *> get_plugins(); 
} 

QList<Plugin*> PluginCollection::get_plugins() 
{ 
    static QList<Plugin*> list; 
    list.push_back(new PluginA()); 
    return list; 
} 
#endif // PLUGINCOLLECTION_H 

和我有關派生 類重寫成員函數鏈接錯誤,所以如果我的類插件有這個純虛成員函數:

virtual QString get()=0; 
    virtual QString set()=0; 
    virtual QString print()=0; 

我有:

  • 鏈接錯誤外部辛博爾的QString __cdecl PluginA :: GET(...)
  • 鏈接錯誤外部辛博爾的QString __cdecl PluginA ::集(...)
  • 鏈接錯誤外部辛博爾的QString __cdecl PluginA ::打印(...)

,然後調用它mainwindow.cpp構造:

ui->setupUi(this); 

    ui->tabWidget->clear(); 
    for(Plugin* p : PluginCollection::get_plugins()) 
    { 
     build_tab_from_plugin(p); 
    } 

p.s.:i'm使用Qt Creator的與msvc14

+1

這不是你如何使用靜態。靜態函數是靜態的一些類或模塊,而不是全局命名空間 –

+0

@DavidHaim內聲明的功能,通常是。但是,爲了組織的目的,您可以將靜態函數放置在其TU中的名稱空間中。但是,我知道這不是OP正在嘗試的。 – StoryTeller

+0

您的換檔鍵是否損壞,tuttomax?這不是與你的同學發短信。句子以大寫字母開頭。 –

回答

1

如果我理解你的權利,你的插件級(你創建的實例)具有純虛成員函數。因此鏈接器無法知道這些成員函數的位置。但是這些成員函數是鏈接器所必需的。

您必須至少有一個每個純虛擬成員函數的實現才能創建此類的實例。

如果使用

virtual QString get(){return QString();} 
virtual QString set(){return QString();} 
virtual QString print(){return QString();} 

,而不是和你的代碼鏈接成功,這是你的問題。

順便說一句,set應該設置一個值,print應打印的東西。因此,它應該是這個樣子:

virtual QString get(){return m_myQStringMember;} 
virtual void set(QString& val){m_myQStringMember = val;} 
virtual void print(){ qDebug() << m_myQStringMember;} 

,如果你想要一個字符串表示,你可以使用這樣的事情:

virtual QString toQString(){return QString("MyClass{ m_myQStringMember=") + m_myQStringMember + "}";} 
+0

我用一些名稱來顯示問題我知道我必須插入一些參數 – tuttomax

+0

我試過了,仍然有鏈接錯誤 – tuttomax

+1

有時候'clean'後面跟着'execute qmake'可以提供幫助。如果不是,則需要提供更多代碼 - 嘗試將其分解爲一個最小示例。這樣做通常會發現錯誤。 – nidomiro

0

我這個

QList<Plugin *> get_plugins() 
    { 
    static QList<Plugin*> list {new PluginA() }; 
    return list; 
    } 

解決爲什麼沒這項工作?

QList<Plugin *> get_plugins() 
     { 
     static QList<Plugin*> list; 
     list.push_back(new PluginA()); 
     return list; 
     } 

這兩個列表都是用列表初始化後者與默認構造函數一起初始化後者。