25

まず、私はC++を初めて使用します。すべてのC++クラスのヘッダーファイルを開きます。今、私は抽象クラスを作成する必要があります。以下は私のコードです

Magic.h

#pragma once
class Magic
{
public:
    Magic(void);
    ~Magic(void);
    virtual void display()=0;
};

Magic.cpp

#include "Magic.h"


Magic::Magic(void)
{
}


Magic::~Magic(void)
{
}

さて、ご存知のように、cppファイルに以下を追加することはできません。

Magic::display()
{
}

だから、私は本当に抽象クラスの.cppファイルが必要ですか?またはdisplay()、.cppファイルを誤って呼び出していますか?

4

5 に答える 5

25

実装ファイルは必要ありません。必要なすべてのメンバーをインラインで定義するだけです (必要がない場合は、純粋な仮想メンバーを定義しないでください)。

class Magic
{
public:
    Magic(void) {};
    ~Magic(void) {};
    virtual void display()=0;
};
于 2012-12-22T08:50:30.967 に答える
13

2-files-per-classとのone-class-in-each-set-of-files規則に従っている.cpp場合は、抽象クラスを作成する場合でもファイルを作成した方がよいでしょう。

一貫性を維持する以外にも、いくつかの利点があります。.cppまたは実装ファイルを使用すると、将来拡張する余地ができます。クラスのファミリに非仮想共通動作を追加する場合、基本クラスは適切な場所です。それを追加します。また、ファイルを少し編集すると、複数の場所からインクルードされ.cppたものよりもコンパイル時間が大幅に短縮されます。.h

慣習は別として、クラス (抽象であろうとなかろうと) を 1 つの.hファイルに配置することができます。STL などのライブラリは常にこれを行っています。

于 2012-12-22T08:49:41.977 に答える
4

抽象クラス (つまりインターフェイス) のソース ファイルは必要ありません。

さらに、何らかの種類の仮想メソッドがある場合は、仮想デストラクタも追加する (またはデストラクタを保護する) 必要があります。また、コンパイラーにデフォルトのコンストラクターを生成させることもできます。純粋な仮想関数 (派生クラスがオーバーライドする必要がある) が必要な場合は、関数本体を追加しないでくださいvoid Magic::display() {}。また、デストラクタに本体を提供する必要があるため、インラインで定義できます。

struct Magic {
    // use default constructor
    virtual void display() =0; // pure virtual function
    virtual ~Magic(); // virtual destructor
};

inline Magic::~Magic()
{
}

またはさらに簡単:

#pragma once

struct Magic {
    virtual void display() =0;
    virtual ~Magic() {}
};
于 2012-12-22T09:08:03.007 に答える
3

いいえ、純粋仮想関数の関数を追加できますdefinitionが、通常、純粋仮想関数の関数定義を提供する必要はありません。の関数戻りタイプが欠落していることに注意してくださいMagic::display()

void Magic::display()
{
}
于 2012-12-22T08:42:52.333 に答える
1

クラスに仮想メソッドのみが含まれている場合、実際にはインターフェースを定義します。インターフェースは本質的に、実装に依存することなく、2つのエンティティ間のコントラクトを表します。したがって、優れた設計手法として、ファイルが必要ないだけでなく、.cppファイルがない方がよいでしょう。

VSを使用しているため、純粋仮想メソッドを持つクラスの代わりに、インターフェイスにMS拡張機能__interfaceを使用することもできます(移植性がないことに注意してください)。

于 2012-12-22T09:01:34.657 に答える