2011-01-13 23 views
8

問題のクラスが*.h*.cpp filesに分割されている場合、いくつかの抽象クラスから継承された純粋な仮想関数を実装する際に問題があります。コンパイラ(g++)は、純粋な関数が存在するため、派生クラスをインスタンス化できないことを伝えています。インタフェースの*.hに、あまりにもderived.hに - C++の純粋仮想関数の実装とヘッダファイル

/** interface.h**/ 
namespace ns 
{ 
    class Interface { 
     public: 
      virtual void method()=0; 
    } 
} 

/** interface.cpp**/ 
namespace ns 
{ 
    //Interface::method()() //not implemented here 
} 

/** derived.h **/ 
namespace ns 
{ 
    class Derived : public Interface { 
     //note - see below 
    } 
} 

/** derived.cpp **/ 
namespace ns 
{ 
    void Derived::Interface::method() { /*doSomething*/ } 
} 

/** main.cpp **/ 
using namespace ns; 
int main() 
{ 
    Interface* instance = new Derived; //compiler error 
} 

は、これは私が二回)(メソッドを宣言 を持っていることを意味するのでしょうか?周りに他の方法はありますか?

+0

これは無効なC++です。 'public void method()= 0;'はJavaに似ています。 –

+0

まず、空の名前空間だけの.cppファイルを持つ理由はありません。抽象クラスに参加するヘッダーの実装ファイルは必要ありません。 – Falmarri

+0

@Falmarriは正しいです。 –

答えて

12

Derived::method()を忘れてしまった。

あなたは少なくともそれを定義しようとしましたが、Derived::method()ではなくDerived::Interface::method()と書いていますが、宣言しようもしませんでした。したがって、それは存在しません。

したがって、Derivedしたがって、純粋仮想関数method()Interfaceからは、上書きされなかった...したがって、Derivedは、仮想純粋であり、インスタンス化できない、何method()を有していません。

また、public void method()=0;は有効ではありません。それはJavaのように見えます。純粋な仮想メンバ関数は実際には仮想でなければなりませんが、virtualは書きませんでした。アクセス指定子の後ろにコロンが続きます。

public: 
    virtual void method() = 0; 
+0

ボトム・ビットはおそらくタイプミスですが、それはjavaでもありません。 – time4tea

+0

@ time4tea:確かにそれは有効なJavaではありませんが、コロンが見つからず、アクセス指定子が宣言に加わったものとみなされていることを意味するので、C++よりも近いです。 –

+0

構文は私のタイプミスでした。オープニングポストへの私のコメントを参照してください:)それは残念です。 また、 'Derived :: Interface :: method()'はInterfaceから継承されるべき関数を定義しようとしています。 私の元の質問は、 "派生クラスの' .h'ファイルで明示的に宣言せずに、継承された純粋仮想関数を実装(定義)できますか?私がそれをしたいのは、クラスがいくつかのインターフェイスから継承し、いくつかの純粋な仮想をそれぞれ含んでいるときに私のヘッダーファイルが乱雑にならないようにすることです。 – Neo

11

サブクラスでメソッドを宣言する必要があります。

// interface.hpp 
class Interface { 
public: 
    virtual void method()=0; 
} 

// derived.hpp 
class Derived : public Interface { 
public: 
    void method(); 
} 

// derived.cpp 
void 
Derived::method() 
{ 
    // do something 
} 
+0

**宣言**(定義していない)を意味すると思います。 –

+0

@MikeSlutskyはいそうでした。 – robert

+0

@robert答えをありがとう。あなたはその理由を打ち明けられますか? Javaから来て、それを行う必要が非常に汚いようです。ベースインターフェースに多くの異なるクラスとメソッドがある場合、ベースインターフェースの変更の場合には多くのファイルを変更する必要があります。 –

関連する問題