嗨,我知道另一篇关于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;
我有:
然后在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创建者
答案 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
两个列表都使用默认构造函数初始化前者,列表初始化后者。