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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
santaPro

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

#1

投稿記事 by santaPro » 8年前

はじめまして
早速なんですが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 が未解決です。

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 8年前

Start.hの} S;がインスタンス(実体)を生成しますので、これが多重定義の原因です。
インスタンスの生成はどこかのcppだけで行なってください。ヘッダは宣言だけにします。
たぶん、宣言と実体の定義の理解が出来ていないことは原因では?

あとpoint.cppとpoint2.cppに分けるのは分かりづらいのでpoint.cppだけにしたほうが良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
あたっしゅ
記事: 334
登録日時: 10年前
住所: 東京23区
連絡を取る:

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

#3

投稿記事 by あたっしゅ » 8年前

**************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();

}
あ、ソフト屋さんに先を越された。
手提鞄あたっしゅ、[MrAtassyu] http://ameblo.jp/mratassyu/
手提鞄屋魚有店(てさげかばんやうおありてん)
レスがついていないものを優先して、レスしています。時々、見当外れなレスをします。

アバター
あたっしゅ
記事: 334
登録日時: 10年前
住所: 東京23区
連絡を取る:

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

#4

投稿記事 by あたっしゅ » 8年前

**************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();

}
こっちのほうがいいかな ?
手提鞄あたっしゅ、[MrAtassyu] http://ameblo.jp/mratassyu/
手提鞄屋魚有店(てさげかばんやうおありてん)
レスがついていないものを優先して、レスしています。時々、見当外れなレスをします。

SantaxPro
記事: 14
登録日時: 8年前

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

#5

投稿記事 by SantaxPro » 8年前

ありがとうございます できました m( _ _ )m
今後とも質問の機会がありましたらまたお願いします

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 8年前

SantaxPro さんが書きました:ありがとうございます できました m( _ _ )m
今後とも質問の機会がありましたらまたお願いします
解決チェックとあたっしゅさんのコードと違う部分があったらcodeタグで投稿をお願いします。
フォーラムルールなのでお願いします。
http://dixq.net/board/board.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

SantaxPro
記事: 14
登録日時: 8年前

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

#7

投稿記事 by SantaxPro » 8年前

ごめんなさい

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();
}
このように変えたらうまくいきました
皆さんの回答でとても綺麗にできるようになりました 本当にありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る