3

次の基本クラスを定義したコードを書いています。

class Chorus{
  public:

    //Destructor
    virtual ~Chorus();

    //callback function
    virtual int callback( void *outputBuffer, void *notUsed, unsigned int 
       nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData );

    virtual void initializeDelayBuffer(void);

    virtual void destroyDelayBuffer(void);
};

これを基本クラスとして使用し、実際にはそれ自体で何もしたくありません。したがって、このクラス Chorus から派生した 2 つの別個のクラスがあります。これは、派生した Chorus クラスが自分のプログラムで使用できると見なされなければならないものについて、いくつかの基本的な制約を提供するためだけに行いました。

プロジェクト (Visual Studio 2008) をビルドすると、この Chorus クラスのすべての仮想関数で未解決の外部シンボル エラーが発生します。これらの関数の前方宣言を行わなかった典型的なエラーだと思います。しかし、それらは仮想であり、派生クラス内で定義されるまで実際に何かを行うように定義したくないので、この問題を解決するにはどうすればよいですか?

4

6 に答える 6

15

子クラスを実装するための単なるプレースホルダーにすることが目的の場合は、= 0で終わることにより、純粋仮想関数にします。たとえば、

virtual void destroyDelayBuffer(void) = 0;

これは、メソッドをいわば「抽象的」にします。C ++コンパイラは、メソッドの実際の定義を検索しませんが、代わりに、インスタンスを作成する前に、すべての派生クラスにこれらのメソッドを実装するように強制します。

于 2009-04-06T19:37:19.877 に答える
3

これらの関数を純粋な仮想として宣言する必要があります。

virtual void initializeDelayBuffer(void)= 0;

それはあなたが望むものである種類のインターフェースを作成します。

于 2009-04-06T19:38:22.137 に答える
2

これは、純粋仮想関数と呼ばれます。C ++では、関数名の後に「= 0」を記述しますが、これらに関するFAQを読みたいと思うかもしれません。

http://www.parashift.com/c++-faq-lite/abcs.html#faq-22.4

于 2009-04-06T19:39:34.770 に答える
2

関数を純粋仮想関数として定義する必要があります。これを行うには、各宣言の後に「=0」を追加します。例えば:

virtual void destroyDelayBuffer(void) = 0;
于 2009-04-06T19:39:49.730 に答える
1

純粋仮想関数を使用します。

  virtual int callback( void *outputBuffer, void *notUsed, unsigned int 
       nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData ) = 0;
于 2009-04-06T19:37:53.853 に答える
1

上記の回答に加えて、純粋仮想関数を含むクラスのオブジェクトをインスタンス化することはできないため、将来、基本クラスのオブジェクトを使用する場合は、関数を非純粋仮想にすることを忘れないでください。

于 2009-04-07T05:26:16.670 に答える