Передача объекта в конструктор абстрактного типа в C ++ - PullRequest
2 голосов
/ 03 октября 2011

Я пытаюсь создать CnD_Message_Handler родительского типа i_MessageHandler. Конструктор 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) { }
};

Ответы [ 3 ]

2 голосов
/ 03 октября 2011

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;
};
1 голос
/ 03 октября 2011

CnD_Message_Handler не имеет пользовательских конструкторов. Вместо этого он пытается использовать конструктор копирования, предоставляемый компилятором бесплатно, и говорит, что не может преобразовать фабрику, которую вы передали, в const CnD_Message_Handler&, которого ожидает конструктор копирования, предоставленный компилятором.

Просто определите конструктор для CnD_Message_Handler, чтобы взять фабрику и создать ее базовый класс:

CnD_Message_Handler(i_MessageFactory& foo) : i_MessageHandler(foo) {}
0 голосов
/ 03 октября 2011

Какие конструкторы определены CnD_Message_Handler? Вам нужен тот, который принимает (ссылка на) i_MessageFactory (или CnD_Message_Factory). Если нет, он попытается сгенерировать автоматически созданные конструкторы, например, конструктор копирования. И я думаю, что это то, что здесь происходит.

...