在 C++ 中将对象传递给抽象类型的构造函数
Passing in an Object to an abstract type's constructor in C++
我试图创建父类型i_MessageHandler的CnD_Message_Handler。i_MessageHandler构造函数接受另一个抽象类i_MessageFactory。CnD_Message_Factory继承自i_MessageFactory。当我尝试实例化CnD_Message_Handler时,我得到以下错误:
错误C2664: 'CnD_Message_Handler::CnD_Message_Handler':无法将参数1从'CnD_Message_Factory'转换为'const CnD_Message_Handler &'原因:无法从'CnD_Message_Factory'转换为'const CnD_Message_Handler'
从在线示例中,我相信我正确地传递了msg_factory。我也很困惑,因为构造函数请求i_MessageFactory(CnD_Message_Factory)而不是i_MessageHandler(CnD_Message_Handler)
提前感谢您的帮助!
CnD_Device(实例化CnD_Message_Factory和CnD_Message_Handler)
CnD_Device::CnD_Device(void)
{
CnD_Message_Factory msg_factory; //Inherited by i_MessageFactory
CnD_Message_Handler msg_handler( msg_factory );
}
CnD_Message_Factory
#include "i_messagefactory.h"
class CnD_Message_Factory :
public i_MessageFactory
{
public:
CnD_Message_Factory(void);
~CnD_Message_Factory(void);
/**
* Creates a message using the stream of data passed in.
* @param id Id of the message to create.
* @param stream Data stream to create the message from.
* @return The created message (which must be returned to the factory by
* calling the deleteMessage() method, or null if the factory could not
* create a message.
*/
Message* createMessage(UInt32 id, const char* stream);
/**
* Returns a message to the factory for deleting/recycling.
* @param msg The message being returned.
*/
void deleteMessage(Message& msg);
};
CnD_Message_Handler
#include "i_messagehandler.h"
class CnD_Message_Handler :
public i_MessageHandler
{
public:
CnD_Message_Handler::~CnD_Message_Handler(void);
/**
* Called by a i_MessageDriver object to process a message received.
* @param msg Message to process.
*/
void CnD_Message_Handler::handleMessage (Message& msg);
/**
* Called by a i_MessageDriver object when an error occurs with an
* interface The exact type of errors are driver specific.
* @param error The error that occurred.
*/
void CnD_Message_Handler::handleError (MessageEvent& error);
/**
* Called by the i_MessageDriver object when an event occurs with an
* interface. The exact type of events are driver specific.
* @param event The event that occurred.
*/
void CnD_Message_Handler::handleEvent (MessageEvent& event);
};
i_MessageHandler
class i_MessageFactory
{
public:
/**
* Destructor.
*/
virtual ~i_MessageFactory(void) { }
/**
* Creates a message using the stream of data passed in.
* @param id Id of the message to create.
* @param stream Data stream to create the message from.
* @return The created message (which must be returned to the factory by
* calling the deleteMessage() method, or null if the factory could not
* create a message.
*/
virtual Message* createMessage(UInt32 id, const char* stream) = 0;
/**
* Returns a message to the factory for deleting/recycling.
* @param msg The message being returned.
*/
virtual void deleteMessage(Message& msg) = 0;
protected:
/**
* Constructor.
*/
i_MessageFactory(void) { }
};
CnD_Message_Handler没有重新定义构造函数。
构造函数在c++ 03中不被"继承"。需要为所继承的所有类型提供构造函数参数。下面是一个例子。
struct Arg {};
struct Foo {
Foo(Arg arg) {}
virtual ~Foo() {}
};
struct Bar : public Foo {
Bar(Arg arg) : Foo(arg) {}
};
可以继承c++ 11,但是需要特殊的语法。
struct Bar : public Foo {
using Foo::Foo;
};
CnD_Message_Handler
没有用户定义的构造函数。相反,它试图使用编译器免费提供给你的复制构造函数,并且它告诉你它不能将你传入的工厂转换为编译器提供的复制构造函数所期望的const CnD_Message_Handler&
。
简单地为CnD_Message_Handler
定义一个构造函数来接受一个工厂并实例化它的基类:
CnD_Message_Handler(i_MessageFactory& foo) : i_MessageHandler(foo) {}
什么是由CnD_Message_Handler定义的构造函数?您需要接受i_message_factory(或CnD_Message_Factory)的引用。如果没有,它将尝试自动生成的构造函数,比如复制构造函数。我认为这就是这里发生的事情。
- 无法创建抽象类的实例
- 用pybind11包装C++抽象类时出错
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 抽象类错误,请参阅声明" "是抽象的
- 将自定义函数传递到基抽象类中以延迟执行
- 将包含抽象类和普通类C++包导出到 Python
- C++:处理抽象类中的错误时出现问题
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- 在 C++ 中使用另一个头文件中的抽象类
- ATL::CComContainedObject<contained>: C2259 无法实例化抽象类
- C++:从抽象类重写纯虚拟运算符重载
- 如何创建shared_ptr抽象类的容器
- .h 或.cpp文件中的抽象类或两者兼而有之?
- 从抽象类继承以创建另一个抽象类时,我应该重新声明所有虚函数吗?
- E0322:不允许使用抽象类类型 " " 的对象
- 可视抽象类 c++(错误 LNK 2001:未解析的外部符号)
- 提升 - 类没有名为"序列化"的成员(抽象类)?
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 对纯抽象类中方法的未定义引用