0

重複の可能性:
前方宣言エラーによる循環依存

構造体 (ここではポート) を定義するファイルと、クラス (ここではデバイス) を定義するファイルの 2 つのファイルがあります。クラスはこれらの構造体をポートとして使用するため、できればポインターによってクラスにリンクする必要があります。しかし、デバイス クラスが定義されていない場合、このポインターを作成するにはどうすればよいでしょうか。

これは大まかにコードを次のようにしたいものです...

backbone.h:

typedef struct aPort {
    std::string portName;
    Device *ptrDeviceThatOwnsPort;
} port;

device.h:

#include "backbone.h"

class Device {
}

...しかし、これは明らかに backbone.h でDevice has not been definedというエラーをスローします。バックボーン ヘッダー ファイルの typedef の前にデバイス ヘッダーを単純にインクルードしようとしましたが、各ヘッダーが別のヘッダーに依存しているため、うまくいきませんでした。私がどこかで読んだところによると、Objectve-C には「先行クラス定義」などの行に沿ったものがあるので (かなり長い間 Obj-C でコーディングしていません)、C++ に似たようなものはありますか? または、私の問題に対するさらに良い解決策はありますか?

どんな助けでも大歓迎です。事前に感謝します。

4

5 に答える 5

6

前方宣言を使用します。

class Device;

typedef struct aPort {
    std::string portName;
    Device *ptrDeviceThatOwnsPort;
} port;
于 2012-10-12T09:53:32.027 に答える
2

デバイスの前方宣言を追加する必要があります。これを行うには、「backbone.h」ファイルを次のように変更します。

class Device;
typedef struct aPort {
    std::string portName;
    Device *ptrDeviceThatOwnsPort;
} port;

これですべてです。

于 2012-10-12T09:53:45.987 に答える
2

構造体にはポインタが含まれているだけDeviceなので、クラスを前方に宣言することで気付くことができます。追加するだけ

 class Device;

aPortヘッダーファイルでの宣言の前。ポインタを使用していない場合は、次のヘッダーファイルをインクルードする必要があります。Device

于 2012-10-12T09:53:59.547 に答える
1

バックボーンで.h。追加

class Device;
于 2012-10-12T09:53:43.590 に答える
1

問題は明らかに、コンパイラが行に到達するまでに

Device *ptrDeviceThatOwnsPort;

それは何であるかを知りませんDeviceDeviceただし、この時点で のヘッダーを含める必要はありません。Deviceポインターを作成しているので、コンパイラーはそれがクラス名であることを知るだけで十分です。次のような前方宣言を追加することにより

class Device;

前に、コンパイラーにそれを知らせ、そのポインターを作成できるようにします。

于 2012-10-12T09:54:28.127 に答える