ページ 11

C++でクラスをヘッダファイルに

Posted: 2012年11月08日(木) 20:20
by santaPro
はじめまして
早速なんですがC++をしていてクラスをうまくヘッダファイルに分けられません

**************Main.cpp********************
#include "DxLib.h"
#include "Start.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

S.point();
S.point2();
S.point3();

}

**************Start.h***********************
class Start{
public:
void point();
void point2();
void point3();
} S;

*************point.cpp********************
#include "Start.h"
void Start::point() { };

*************point2.cpp*******************
#include "Start.h"
void Start::point2(){ };

**********************************************

こんな感じで一個ずつ分けたいんですがたぶんMain,point,poin2で "Start.h"を重複インクルード?してるからなのか
動きません エラーは

1>point.obj : error LNK2005: "class Start S" (?S@@3VStart@@A) は既に Main.obj で定義されています。
1>point2.obj : error LNK2005: "class Start S" (?S@@3VStart@@A) は既に Main.obj で定義されています。
1>point2.obj : error LNK2005: "public: void __thiscall Start::point(void)" (?point@Start@@QAEXXZ) は既に point.obj で定義されています。
1>point3.obj : error LNK2005: "class Start S" (?S@@3VStart@@A) は既に Main.obj で定義されています。
1>point3.obj : error LNK2005: "public: void __thiscall Start::point(void)" (?point@Start@@QAEXXZ) は既に point.obj で定義されています。
1>Main.obj : error LNK2019: 未解決の外部シンボル "public: void __thiscall Start::point3(void)" (?point3@Start@@QAEXXZ) が関数 _WinMain@16 で参照されました。
1>Main.obj : error LNK2019: 未解決の外部シンボル "public: void __thiscall Start::point2(void)" (?point2@Start@@QAEXXZ) が関数 _WinMain@16 で参照されました。
1>E:\120927\han\Game project\MusicProject\Debug\GameProg.exe : fatal error LNK1120: 外部参照 2 が未解決です。

だれか解決策かもっとわかりやすく典型的なクラスの分け方ありませんか?

Re: C++でクラスをヘッダファイルに

Posted: 2012年11月08日(木) 20:46
by softya(ソフト屋)
Start.hの} S;がインスタンス(実体)を生成しますので、これが多重定義の原因です。
インスタンスの生成はどこかのcppだけで行なってください。ヘッダは宣言だけにします。
たぶん、宣言と実体の定義の理解が出来ていないことは原因では?

あとpoint.cppとpoint2.cppに分けるのは分かりづらいのでpoint.cppだけにしたほうが良いと思います。

Re: C++でクラスをヘッダファイルに

Posted: 2012年11月08日(木) 20:53
by あたっしゅ
**************Start.h***********************

コード:

class Start{
public:
void point();
void point2();
void point3();
} ; // ここで S を定義すると、すべての start.h をインクルードした .cpp で、S が定義され、
// リンクすると、「すでに定義されています」となる。
**************Main.cpp********************

コード:

#include "DxLib.h"
#include "Start.h"

Start S; // ここで S を定義する。

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

S.point();
S.point2();
S.point3();

}
あ、ソフト屋さんに先を越された。

Re: C++でクラスをヘッダファイルに

Posted: 2012年11月08日(木) 20:55
by あたっしゅ
**************Main.cpp********************

コード:

#include "DxLib.h"
#include "Start.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
Start S;

ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

S.point();
S.point2();
S.point3();

}
こっちのほうがいいかな ?

Re: C++でクラスをヘッダファイルに

Posted: 2012年11月08日(木) 21:03
by SantaxPro
ありがとうございます できました m( _ _ )m
今後とも質問の機会がありましたらまたお願いします

Re: C++でクラスをヘッダファイルに

Posted: 2012年11月08日(木) 21:12
by softya(ソフト屋)
SantaxPro さんが書きました:ありがとうございます できました m( _ _ )m
今後とも質問の機会がありましたらまたお願いします
解決チェックとあたっしゅさんのコードと違う部分があったらcodeタグで投稿をお願いします。
フォーラムルールなのでお願いします。
http://dixq.net/board/board.html

Re: C++でクラスをヘッダファイルに

Posted: 2012年11月08日(木) 22:19
by SantaxPro
ごめんなさい

Main.cppを

コード:

#include "DxLib.h"
#include "Start.h"

Start S;

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

	S.point();
	S.point2();
	S.point3();
}
このように変えたらうまくいきました
皆さんの回答でとても綺麗にできるようになりました 本当にありがとうございました