2

しばらくの間、stackoverflow と google を調べてきましたが、循環参照、不完全な型、ポリモーフィズムに関する特定の質問に対する答えが見つからないようです。

多くのコードを投稿せずにこの質問を説明できることを願っていますが、失敗した場合はお知らせください。簡単な例を書き留めます。

私は 2 つのクラスを持っていますが、どちらもお互いを使用しています (クラス COne と CTwo など)。また、クラス COne には基本クラス (BaseOne など) があります。

循環依存の問題を「解決」するために、ヘッダー ガード (そう呼ぶ場合) と不完全な型を使用します。

上部のヘッダー ファイルで:

#pragma once

そして、CTwo の C++ ファイルの上部のどこかに:

class COne;

ここで、不完全な型のためにコンパイラが COne が BaseOne から派生したものであることを認識していないように見えるという問題に遭遇します。そのため、戻り値の型が BaseOne* の関数では、COne* を返したいと考えています。これはダウンキャストである可能性がありますが、同じ型ではないと言われています。Cスタイルのキャストを使用してこれを修正しました

return (BaseOne*)m_c_one;

私が聞きたかったこと: C スタイルのキャストを使用してこれを解決するより良い方法はありますか?

4

1 に答える 1

1

C スタイルのキャストは、COneオブジェクトとそのサブオブジェクトが同じメモリ アドレスを持つことが保証されていないため、安全ではありません (標準レイアウト クラス (9p7) のBaseOne場合は保証されますが、一般にポリモーフィズムは排除されます)。COne

COneキャスト (3.2p5) を実行するには、コンパイラが完全である必要があります。これCOneは、仮想継承または多重継承を使用できるためであり、一般に、ポリモーフィック クラスは単純なメモリ レイアウトを必要としないためです。

struct COne: BaseZero, BaseOne { ... };
struct COne: virtual BaseOne { ... };

の定義が利用可能なソース ファイル内のポイントにキャストを移動するか、ソース ファイル内の定義が利用可能なポイントで実装を使用しCOneて独自のキャスト関数を記述する必要があります。BaseOne *to_base(COne *)COne

于 2013-05-09T10:07:33.580 に答える