2011-07-20 9 views
2

私はクラスChildとクラスHumanを持っています。Humanには、仮想関数としてChildに宣言されているすべての関数があります。クラスChildHumanクラスから継承しています。C++でインターフェイスクラスの実装を使用する正しい方法は何ですか?

Childの実装を非表示にするインターフェイスファイルとしてHumanを使用します。

私はコンストラクタを実際にセットアップしませんでしたが、基本設定を初期化するinit()関数を設定しました。

インターフェイスファイルを使用してChild機能を使用するにはどうすればよいでしょうか?

私は

Human *John = new Child(); 

を試してみましたが、私は次のエラーを得ました。

main.cpp:7: error: expected type-specifier before ‘Child’ 
main.cpp:7: error: cannot convert ‘int*’ to ‘Human*’ in initialization 
main.cpp:7: error: expected ‘,’ or ‘;’ before ‘Child 

int*がどちらから来たのか分かりません。宣言された関数のどれもint *を返しません。

編集

main.cppに

#include <stdlib.h> 
#include <stdio.h> 
#include "Human.h" 
using namespace std; 
int main(){ 

    Human *John = new Child(); 

    return 0; 
} 

human.h

#ifndef __HUMAN_h__ 
#define __HUMAN_h__ 


class Human 
{ 
public: 
    virtual void Init() = 0; 
    virtual void Cleanup() = 0; 
}; 


#endif 

Child.h

#ifndef __CHILD_h__ 
#define __CHILD_h__ 

#include "Human.h" 


class Child : public Human 
{ 
public: 
    void Init(); 
    void Cleanup(); 

}; 

#endif 

Child.cpp

#include "Child.h" 
void Child::Init() 
{ 
} 

void Child::Cleanup() 
{ 
} 

あなたのcppファイルに#include "Child.h"に必要なMakefileの

CC = g++ 
INC = -I. 
FLAGS = -W -Wall 
LINKOPTS = -g 

all: program 

program: main.o Child.o 
    $(CC) -Wall -o program main.o Child.o 

main.o: main.cpp Human.h 
    $(CC) -Wall -c main.cpp Human.h 

Child.o: Child.cpp Child.h 
    $(CC) -Wall -c Child.cpp Child.h 

Child.h: Human.h 

clean: 
    rm -rf program 
+5

コードをさらに投稿してください。また、コードが表示されていないので推測するだけで、 'Human'クラス定義の末尾にセミコロン('; ')を追加してください; – phooji

+0

[here](http:// sscce .org /)。 –

+0

私は上記のコードを編集し掲示しました – user482594

答えて

7

。あなたはhuman.hを含むとともに、これを行うことができたり、あなたのmain.cppにして、子クラスの定義を持っていないchild.h

#include <stdlib.h> 
#include <stdio.h> 
#include "Child.h" 
#include "Human.h" // This is no longer necessary, as child.h includes it 
using namespace std; 
int main(){ 
    Human *John = new Child(); 
    return 0; 
} 
+1

Re:これはもう必要ありません。child.hにはそれが含まれています。私はそのようなことについて賢明な傾向があります。私のコードがHuman.hからのコンストラクトを使用する場合、私はChild.hが必ず同じ#includeを実行しなければならないことを知っていても、Human.h "を#includeします。 –

2

内とhuman.hが含まにより自動的にもたらされるだろう含めることはできません。代わりにChild.hの

#include "human.h" 

:おそらくあなたはHuman.h含ま

#include "child.h" 

をしかし、それは推測です。確かに、Childクラスの定義を含むコードは、エラーが発生した時点でMain.cppで使用できません。 #ifdefプリコンパイラ指令の#includeまたはmissuseが間違っているか不足している可能性があります。しかし、より良いお手伝いをするためには、 "Child.h"と "Human.h"の宣言と "Main.cpp"の完全コードのようなコードが必要になります。

インターフェイス部分。本当にきれいなインターフェースを得るためには、その中に関数を実装すべきではありません。それはインターフェイスを使用する際のベストプラクティスです。 C++では、いくつかの関数を実装することができますが、それはインタフェース(純粋な仮想クラスまたは抽象クラスともいう)ではなく、仮想クラス(まだインスタンス化できませんが、インタフェースと見なすことができる抽象クラスではありません)

+0

返事をありがとう。 – user482594

+0

私はまだ私の答えを書いていたときにコードを掲示しました: –

+0

私は複数の答えを選択することができます。 – user482594

関連する問題