ページ 11

引数にオブジェクトを渡したい

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にしかしてませんでした。
無事に解決することができました。ありがとうございます。
オフトピック
インクルードガードはインクルードするファイルが無い時は、書いても意味の無いものだと思っていましたが
インクルードするファイルが無くても何か役目?効果?があるようですね。
一体何をするものなんでしょうか...