2010-11-23 4 views
1

私は、抽象基底クラスAを持ち、そこからBを派生していると仮定します。次のコードでC++:子クラスポインタを返す

A* myInst = (A*) new B; 

A* GetA() { return myInst; } 
B* GetB() { return (B*) myInst; } 

最初の機能はコンパイル、第二はありません。エラー:error C2143: syntax error : missing ';' before '*'

  • なぜ私はAの子クラスへのポインタを返すことができませんか?

エラーは、機能の内容をreturn NULL;に置き換えた場合にも発生します。

+0

関数宣言の後に余分なセミコロンが奇妙に見えます。削除してください。 – Lagerbaer

+0

これは、関数がインラインであったことを意識していません。 – Parror

+0

実際にそのエラーはどの行ですか? ';'エラーは単にセミコロン(曖昧な、はい)が足りないことを意味する可能性があるので、コード全体を表示したいかもしれません – birryree

答えて

0

ブレースを外した後に、セミコロンを残してみましたか?例:

A* myInst = (A*) new B; 

A* GetA() { return myInst; } 
B* GetB() { return (B*) myInst; } 

注:私はこの時点でC++コンパイラへのアクセス権を持っていないとして、私はこれを試していませんでした...

+0

はい、セミコロンの例は、 – Parror

+0

の前にインラインになっていたためです(同じエラーが発生します) – Parror

4

問題は、コンパイラは何わかりません可能性が最も高いですAまたはBです。欠落している可能性が最も高い。

しかしそれとは別に、クラスと一緒にCスタイルの型キャストを使用することは決してありません。またはさらに良い。

static_cast(変換がOKであることがわかっている場合)またはdynamic_cast(確認が必要な場合)を使用してください。

+1

+1と思われる診断と健全なアドバイス(+2:/できません) –

+0

実際には何か問題があります私のインクルード - それはそこにありますが、クラスは未定義のままです – Parror

+2

正しいです。 http://codepad.org/J2WQlypMから見ることができるように、コンパイラがAとBが何であるか知っていれば、すべてがコンパイルされます。 @Parror:あなたのインクルードガードをチェックしてください。これは、私が.hファイルをコピーしても、#ifndefマクロ名を更新するのを忘れたときに起こります。 – Bill

0

私はこれらの行が実際のコードで別々のファイルに表示されていると推測します。

ほとんどの場合、GetBが定義されている場合は、Bのインクルードを忘れてしまい、コンパイラがその型であることがわかりません。

また、Cスタイルのキャストの代わりにstatic_castを使用した場合、コンパイラはABの関係を判別できなかった場合に警告します。

1

C++でのCスタイルのキャストに注意してください。経験則として:決してそれらを使用してください。適切なC++キャストを使用します。

それとは別に、最初のキャストが完全に冗長である:

A* myInst = new B; 

A* GetA() { return myInst; } 
B* GetB() { return static_cast<B*>(myInst); } 

これが正常に動作します。

+0

それは 'dynamic_cast'であるべきではありませんか? –

+0

@エヴァン:それに依存します。 * myInst'が 'B'オブジェクトを含んでいることをコード*が知っていれば、' static_cast'が優先されます。これは 'myInst'の型を知っているという意味を伝えます(そして速くなります)。 'dynamic_cast'は、動的な型が分からず、潜在的な失敗が予想されるときにのみ意味があります。 –

+0

フェア十分、+1。 –

0

ほとんどの場合、キャストしないでください。

B bInst 
A * myInst = &bInst; 
A* getA() { return &bInst; } 
B* getB() { return &bInst; } 

simples!

階層をキャストダウンすることはまれです。通常、これは何らかのアドオンをロードし、オブジェクトがあなたが期待しているタイプであることをチェックする必要がある場所です。その場合は、dynamic_cast <>を使用して確認しますが、RTTIが必要です。

他の場合は、関連しないタイプの記憶域がある場合に発生します。たとえば、単一のコレクションに一緒に格納されるという事実によってのみ関連するバリアント/ "任意の"タイプです。これは、ステートマシンでも発生します。キャストを避けるためにここであなたの流れを設計することは可能かもしれませんが、キャスティングがより簡単です。そのような場合は、あなたが持っているタイプを正確に知っていて、その階層をstatic_castでダウンできます。

関連する問題