1

この状況を回避する方法について、再構築せずに誰かが提案を提供できるかどうか疑問に思いました。クラス宣言を含み、参照/ポインターによって使用するクラスの数を宣言するヘッダーがあります。これは、単に含めるよりも明らかに良い習慣です。それらのクラスのヘッダー。

struct Foo;

struct Bar;

struct MyStruct
{
    void doIt( const Foo* foo );

    void doIt( const Bar* bar );
};

ただし、上記の例ではFooはクラスですが、Barは実際には、以下の大まかな例のようにクラスのtypedefです。

#include <fd_ex.h>

struct Foo
{
   int a;
};

struct Bar_
{
   int a;
};

typedef Bar_ Bar;

struct Bar事前宣言が明らかに正しくないため、これによりいくつかの問題が発生します-Bar構造体ではありません:

"fd_ex.cpp", line 13: Error: Multiple declaration for Bar.
"fd_ex.cpp", line 19: Error: The name Bar is ambiguous, Bar and Bar.
2 Error(s) detected.

Bar_主に、実際にはこの例よりもはるかに複雑になる可能性があるため、可能であれば公開したくありません。

ただし、のstruct宣言とtypedefを制御できない場合、事前宣言の精神を維持するためにBarヘッダーで使用できる手法はありますか?MyStructBar

4

3 に答える 3

5

mystruct.hC ++でもまったく同じように機能するかどうかはわかりませんが、Cでは、ヘッダーファイル(たとえば)に次のような「不透明な」構造体を宣言することがよくあります。

typedef struct MyStruct_ MyStruct;

// + function prototypes using MyStruct*

そして、MyStruct実際にはそれが何であるかを知らなくても、ポインタを使用できます:MyStruct *x;、しかし、そうではありませんMyStruct x[3];(コンパイルされたものはMyStructのサイズを知らないため)

次に、ソースファイルmystruct.cでを定義しstruct MyStruct_ます。

だから私はあなたが置き換えることを試みることができると思います:

class Bar;

と:

typedef struct Bar_ Bar;

typedef Bar_ Bar;(おそらくC ++で言うことができます)

于 2012-08-31T09:35:04.050 に答える
4

構造体自体を前方宣言できます。

struct Bar_;

typedef Bar_ Bar; 

class MyClass
{
  void DoIt( Bar* );
};
于 2012-08-31T09:26:00.300 に答える
2

これでうまくいくはずです:

struct Bar_;
typedef Bar_ Bar;
于 2012-08-31T09:30:33.953 に答える