はじめまして
早速なんですが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 が未解決です。
だれか解決策かもっとわかりやすく典型的なクラスの分け方ありませんか?
C++でクラスをヘッダファイルに
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: C++でクラスをヘッダファイルに
Start.hの} S;がインスタンス(実体)を生成しますので、これが多重定義の原因です。
インスタンスの生成はどこかのcppだけで行なってください。ヘッダは宣言だけにします。
たぶん、宣言と実体の定義の理解が出来ていないことは原因では?
あとpoint.cppとpoint2.cppに分けるのは分かりづらいのでpoint.cppだけにしたほうが良いと思います。
インスタンスの生成はどこかのcppだけで行なってください。ヘッダは宣言だけにします。
たぶん、宣言と実体の定義の理解が出来ていないことは原因では?
あとpoint.cppとpoint2.cppに分けるのは分かりづらいのでpoint.cppだけにしたほうが良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: C++でクラスをヘッダファイルに
**************Start.h***********************
**************Main.cpp********************
あ、ソフト屋さんに先を越された。
class Start{
public:
void point();
void point2();
void point3();
} ; // ここで S を定義すると、すべての start.h をインクルードした .cpp で、S が定義され、
// リンクすると、「すでに定義されています」となる。
VTuber:
[香車]東上☆Aho(暎帆)☆海美
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
[香車]東上☆Aho(暎帆)☆海美
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
Re: C++でクラスをヘッダファイルに
**************Main.cpp********************
こっちのほうがいいかな ?
VTuber:
[香車]東上☆Aho(暎帆)☆海美
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
[香車]東上☆Aho(暎帆)☆海美
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
Re: C++でクラスをヘッダファイルに
ありがとうございます できました m( _ _ )m
今後とも質問の機会がありましたらまたお願いします
今後とも質問の機会がありましたらまたお願いします
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: C++でクラスをヘッダファイルに
解決チェックとあたっしゅさんのコードと違う部分があったらcodeタグで投稿をお願いします。SantaxPro さんが書きました:ありがとうございます できました m( _ _ )m
今後とも質問の機会がありましたらまたお願いします
フォーラムルールなのでお願いします。
http://dixq.net/board/board.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: C++でクラスをヘッダファイルに
ごめんなさい
Main.cppを
このように変えたらうまくいきました
皆さんの回答でとても綺麗にできるようになりました 本当にありがとうございました
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();
}
皆さんの回答でとても綺麗にできるようになりました 本当にありがとうございました