2

親タイプ 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_MessageHandler(CnD_Message_Handler) の代わりに i_MessageFactory(CnD_Message_Factory) を要求するので、私も混乱しています

事前に助けてくれてありがとう!

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) { }
};
4

3 に答える 3

2

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;
};
于 2011-10-03T15:01:00.147 に答える
1

CnD_Message_Handlerユーザー定義のコンストラクターはありません。const CnD_Message_Handler&代わりに、コンパイラが無料で提供するコピーコンストラクタを使用しようとし、渡したファクトリをコンパイラ提供のコピーコンストラクタが期待するものに変換できないことを伝えます。

CnD_Message_Handlerファクトリを取得してその基本クラスをインスタンス化するためのコンストラクタを定義するだけです。

CnD_Message_Handler(i_MessageFactory& foo) : i_MessageHandler(foo) {}
于 2011-10-03T15:01:22.420 に答える
0

CnD_Message_Handler によって定義されるコンストラクターは何ですか? i_MessageFactory (または CnD_Message_Factory) (への参照) を取るものが必要です。そうでない場合は、コピー コンストラクターのように、自動的に生成されたコンストラクターを試します。そして、それがここで起こっていることだと思います。

于 2011-10-03T14:55:29.490 に答える