0

2 つのヘッダー ファイルとソース ファイルがあり、

food.h:

#ifndef _FOOD_H
#define _FOOD_H

struct food {
    char name[10];
};

#endif

犬.h:

#ifndef _DOG_H
#define _DOG_H

class food;  //forward declaration

class Dog {
public:
    Dog(food f);

private:
    food _f;
};

#endif

そして、これが のソースファイルですclass dog

//dog.cpp
#include "dog.h"
#include "food.h"

Dog::Dog(food f) : _f(f)
{}

問題は、上記のコードをコンパイルできることですが、エラーが発生しました_f has incomplete type

dog.hに forward 宣言を入れてにインクルードできると思ったのですfood.hが、うまくいきdog.cppません。そして、ユーザー定義のヘッダーファイルをファイルに入れるべきではありません.hよね? 非推奨ですよね?

4

2 に答える 2

3

この場合、Dogクラスに のインスタンスがあるため、前方宣言は機能しませんfood。コンパイラは、foodを宣言するためにの完全な宣言を必要としDogます。

インクルードの非推奨に関する質問については、私が何か誤解していない限り、まったく真実ではありません。ここに含めるfood.hと、問題が解決します。

//dog.h
#ifndef DOG_H
#define DOG_H

#include "food.h";

class Dog {
public:
    Dog(food f);

private:
    food f_;
};
于 2012-08-02T15:28:52.973 に答える
2

コンパイラは_f、前方宣言だけではアクセスできないオブジェクトのサイズを知る必要があります。これへのポインターを使用していた場合はclass food機能しますが、メンバーが完全なクラス インスタンスであるため、コンパイラーが のサイズを認識できるようにヘッダーを含める必要がありますclass food

同様に、継承元の場合、前方宣言は機能しませんclass food。具体的にはヘッダーを含める必要があります。

前方宣言を削除するだけ#include "food.h"で、コードがコンパイルされます。

于 2012-08-02T15:28:51.603 に答える