ページ 1 / 1
引数にオブジェクトを渡したい
Posted: 2016年4月01日(金) 22:56
by PUMP
コード:
//[myclass.h]
//classを宣言する
class MyClass {
int Draw();
};
コード:
//[myclass.cpp]
//classの実装
#pragma once
#include "myclass.h"
int MyClass::Draw() {
return 0;
}
コード:
//[tmp.h]
//tmp関数宣言、引数をMyClassのオブジェクトにしたい
int tmp(MyClass);
コード:
//[tmp.cpp]
//tmp関数の実装
#pragma once
#include "tmp.h"
#include "myclass.h"
int tmp(MyClass my) {
my.Draw(); //クラスの関数呼び出し
return 0;
}
コード:
//[main.cpp]
//メイン関数
#pragma once
#include "tmp.h"
#include "myclass.h"
int main() {
MyClass my;
tmp(my); //tmp関数呼び出し
return 0;
}
このように、関数の引数にオブジェクトを渡したいのですが
「定義されていない識別子です。」とエラーが出てしまいます。
tmp.hでMyClassが定義されていないのが原因なのは分かっていますが、解決方法が自分には思いつきません。
解決方法を教えてください。
Re: 引数にオブジェクトを渡したい
Posted: 2016年4月01日(金) 23:37
by みけCAT
各ヘッダにインクルードガードを追加して、tmp.hからmyclass.hをインクルードするだけではダメなのですか?
Re: 引数にオブジェクトを渡したい
Posted: 2016年4月02日(土) 08:00
by PUMP
それは一度試したんですが、'class' 型の再定義というエラーが...
ヘッダファイルでヘッダファイルをインクルードするのはあんまり良くないと聞いたことがありますし
Re: 引数にオブジェクトを渡したい
Posted: 2016年4月02日(土) 09:16
by みけCAT
PUMP さんが書きました:それは一度試したんですが、'class' 型の再定義というエラーが...
classは予約語なので、class型は存在しないはずです。
きちんと
インクルードガードを追加しましたか?
別の方法として、引数を参照にして前方宣言を使い、必要なら関数の実装側でコピーする方法が考えられます。
コード:
//[tmp.h]
#ifndef TMP_H_GUARD_1DA0130D_623C_4AC7_8E0B_93891DFED7C5
#define TMP_H_GUARD_1DA0130D_623C_4AC7_8E0B_93891DFED7C5
//tmp関数宣言、引数をMyClassのオブジェクトにしたい
class MyClass;
int tmp(const MyClass&);
#endif
コード:
//[tmp.cpp]
//tmp関数の実装
#pragma once
#include "tmp.h"
#include "myclass.h"
int tmp(const MyClass& my_arg) {
MyClass my = my_arg;
my.Draw(); //クラスの関数呼び出し
return 0;
}
Re: 引数にオブジェクトを渡したい
Posted: 2016年4月02日(土) 17:10
by PUMP
みけCAT さんが書きました:各ヘッダにインクルードガードを追加して、tmp.hからmyclass.hをインクルードするだけではダメなのですか?
各ヘッダにインクルードガード = myclass.hにもインクルードガード ということですね。 すみません、完全に見落としててtmp.hにしかしてませんでした。
無事に解決することができました。ありがとうございます。
オフトピック
インクルードガードはインクルードするファイルが無い時は、書いても意味の無いものだと思っていましたが
インクルードするファイルが無くても何か役目?効果?があるようですね。
一体何をするものなんでしょうか...