在 C++ 中将对象传递给抽象类型的构造函数

Passing in an Object to an abstract type's constructor in C++

本文关键字:抽象类 抽象 类型 构造函数 C++ 对象      更新时间:2023-10-16

我试图创建父类型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)的引用。如果没有,它将尝试自动生成的构造函数,比如复制构造函数。我认为这就是这里发生的事情。