アプリ版:「スタンプのみでお礼する」機能のリリースについて

Javaを仕事で使っています。
最近趣味でC++を始めました。色々形式の違いに戸惑っています。

C++では関数を宣言しなければならないので、クラス名と同じヘッダーファイルにそのクラスで使う関数を宣言して、それをインクルードしています。

そこで今、壁にぶちあたりました。
あるクラス(仮にFooとします)の関数で、他のクラス型(Hogeとします)を引数に取りたいので、ヘッダーファイルにそれを宣言しようとしているのですが、コンパイルエラーになってしまいます。

Foo.hは以下のような感じ。

#include Hoge.h
中略
GetHoge(Hoge hoge);

コンパイルエラーでは
error C2011: 'Hoge' : 'class' 型の再定義
などと言われます。

クラスとその同名のヘッダーファイル、という形式を変えずに
他のクラス型を引数にとる関数を作るには、どうしたらよいのでしょうか?

C++に関しては全くの素人です。詳しい方、ご教示願います。

A 回答 (2件)

通常、



#ifndef HOGE_H
#define HOGE_H
// ヘッダファイルの中身
#endif

とすることで、複数回Hoge.hをインクルードしても重複定義になることを回避します。

ところで、

> GetHoge(Hoge hoge);

の部分ですが、Hogeを値渡しする必然性はあるのでしょうか?
もし、GetHoge(const Hoge& hoge);のように参照渡しまたはポインタ渡しで済むのであれば、

class Hoge;
int GetHoge(const Hoge& hoge);

のようにすることでHoge.hをインクルードせずに済みます。
このように、可能な限りソースファイル(ヘッダファイルを含む)間の依存関係は少なくしておくことをお勧めします。
    • good
    • 0

> error C2011: 'Hoge' : 'class' 型の再定義


> などと言われます。

多分「インクルードガード」でググれば解決すると思われます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!