从静态函数返回静态列表导致链接错误

时间:2016-07-27 09:29:16

标签: c++

嗨,我知道另一篇关于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

我有关于派生类的覆盖成员函数的链接错误 所以如果我的类Plugin有这个纯虚拟成员函数:

 virtual QString get()=0; 
  virtual QString set()=0;
  virtual QString    print()=0;
我有:

  • 链接错误外部simbol QString __cdecl PluginA :: get(...)
  • 链接错误外部simbol QString __cdecl PluginA :: set(...)
  • 链接错误外部simbol QString __cdecl PluginA :: print(...)

然后在mainwindow.cpp构造函数中调用它:

  ui->setupUi(this);

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

ps.s.:i' ;m使用带有msvc14的qt创建者

2 个答案:

答案 0 :(得分: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 + "}";}

答案 1 :(得分:0)

我解决了这个

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

为什么这不起作用?

def send_deliverer_push_notification(order_fulfillment, parse_events)
shopper_id               = order_fulfillment.shopper_id
order                = Order.find_by(id: order_fulfillment_id)
user_id              = order.user_id
role_name            = Shopper.find_by(id: shopper_id).roles.pluck(:name).first
batch_id             = Batch.find_by(shopper_id: shopper_id).id
message              = "Order # #{order_fulfillment.order_id} is now ready for pick-up"

ParseHelpers.publish_batching_status(user_id, *parse_events, message) do
    {
    shopper_id:   shopper_id,
    role:     role_name,
    task:     order_fulfillment.shopper_status,
    batch_id: batch_id,
    fulfillment_number: "#{order.order_number}-#{order_fulfillment.store_id}"
    }
    end
  end

两个列表都使用默认构造函数初始化前者,列表初始化后者。