質問

私は、次の基本クラスを定義したいくつかのコードを書いています。

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

私は、基本クラスとしてこれを使用すると、実際に自分自身でそれで何もできません。だから私は、このクラスのコーラスから派生している2つの別々のクラスを持っています。私は単純には私のプログラムで使用可能と考えることにするために、必要なすべての派生コーラスクラスへといくつかの基本的な制約を提供するためにこれをやってみたかった。

私は私のプロジェクト(のVisual Studio 2008)を構築するとき、私はこのコーラスクラスからのすべての仮想関数の未解決の外部シンボルエラーを取得します。私はそれが私がこれらの関数の宣言を前進しなかった典型的な誤りだ推測しています。しかし、彼らは仮想であり、私は彼らが私はこの問題を解決するために行う何を導出クラス内で定義されるまで、それらが実際に何かをするように定義することにしたくないので、?

役に立ちましたか?

解決

彼らは単に、その後、実装する子クラス用のホルダーを置く例えば= 0で終わることによって、それらの純粋仮想関数を作ることをするために、

あなたの意図がある場合は、

virtual void destroyDelayBuffer(void) = 0;

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

他のヒント

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

仮想initializeDelayBuffer(ボイド)が0 =無効

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

これは純粋仮想関数と呼ばれます。 C ++では、あなたは、関数名の後に「= 0」を書きます しかし、あなたはおそらく、これらのFAQを読みたい。

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

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

virtual void destroyDelayBuffer(void) = 0;

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

  virtual int callback( void *outputBuffer, void *notUsed, unsigned int 
       nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData ) = 0;
あなたは、基本クラスのオブジェクトを持っているつもりならば、関数は非純粋仮想作るために覚えて将来のため

ただ、上記の回答に追加するには、あなたは、純粋仮想関数を含むクラスのオブジェクトをインスタンス化することはできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top