🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1741閲覧

ヘッダーとソースを分けているコードでソースでインクルードする行為は正しいのかどうか?

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/02/25 13:56

提示コードですが.cpp部で上部のコメント部///のようにインクルードしているのですがソース部でインクルードするという行為は正しいのでしょうか?ソースはヘッダーどっちかにまとめるべきなのでしょうか?

hpp

1#ifndef ___GAME_SCENE_HPP_ 2#define ___GAME_SCENE_HPP_ 3 4#include "Scene_base.hpp" 5 6#include "Entry.hpp" 7 8class Stage; 9enum class Scene_Type; 10/*#################################################### 11* メインゲーム シーン 12* 13* 説明 14* メインのゲーム画面 15######################################################*/ 16class Game_Scene : public Scene_base 17{ 18public: 19 Game_Scene(Scene_Type t,Entry* e); //コンストラクタ 20 ~Game_Scene(); //デストラクタ 21 22 void Update(); //更新 23 void Draw(); //描画 24 25private: 26 27 28 29 std::shared_ptr<Stage> stage; 30 31 Entry* Owner; //Entry クラス 32 33}; 34 35#endif 36

cpp

1#include "Game_Scene.hpp" 2#include "Stage.hpp"///////////////////////////////////////////////////// 3 4 5//コンストラクタ 6Game_Scene::Game_Scene(Scene_Type t,Entry *e) : Scene_base(t,e) 7{ 8 Owner = e; //Entry クラス 9 10 11 // ##### スプライトをロード ##### 12 13 int Player_Handle = Owner->LoadSprite("Assets/Player/Player_0.png"); //プレイヤー 14 int Enemy_Handle = Owner->LoadSprite("Assets/Enemy.png"); //エネミー 15 16 int Block_Handle = Owner->LoadSprite("Assets/Block.png"); //ブロック 17 int Brick_Handle = Owner->LoadSprite("Assets/Brick.png"); //レンガ 18 int Shop_Handle = Owner->LoadSprite("Assets/Shop.png"); //ショップ 19 20 // ##### コンポーネント ##### 21 stage = std::make_shared<Stage>(); 22 23 24 25} 26 27//更新 28void Game_Scene::Update() 29{ 30 stage->Update(); 31 32 33} 34 35//描画 36void Game_Scene::Draw() 37{ 38 stage->Draw(); 39 40 41} 42 43//デストラクタ 44Game_Scene::~Game_Scene() 45{ 46 47} 48

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/02/25 13:59

> ソース部でインクルードするという行為は正しいのでしょうか? 「単なるヘッダのインクルード」に関する疑問なのですか?それとも、違った背景があるのですか?
退会済みユーザー

退会済みユーザー

2021/02/25 14:04

単なるヘッダーのインクルードです。循環インクルードや ヘッダーの衝突などの関係で仕方がなくソース部にインクルードをしないとけいなくなってしまいまいました。
guest

回答3

0

ベストアンサー

includeはコピペ機能です.
だから以下は正当.

C++

1//CPP 2#include <iostream> 3 4int main(void) 5{ 6 std::cout << "Hello " 7 8#include "EndPart.h"

"EndPart.h"の中身:

C++

1 "World" << std::endl; 2 return 0; 3}

#include "EndPart.h"の箇所に,"EndPart.h"の内容丸ごとペーストされて,それからコンパイルが始まります.

「ヘッダファイル」とか呼んでいる物は,コピペしたい内容を書いただけのテキストファイルだというわけです.

以上より,「どこに include を書くか?」というのは明確です.

  • 「ヘッダファイル」の内容をペーストする必要がある場所に書く
  • 逆に言えば,その必要が無い場所には書かない

それだけです.

投稿2021/02/26 01:29

fana

総合スコア11985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/02/26 01:40

つまり,あなたが「何のために/何の必要があって include を書くのか」を考えればよいわけです. includeの用途が「型の定義だとか関数の宣言だとかをそこにペーストする」であるときには, 型の定義や関数の宣言が無いと困る場所にincludeを書くわけです.
fana

2021/02/26 01:58

プログラムのコードを,.cpp と .h なる複数のファイルにわざわざ分割して書くのは, コードの一部(.h側に書いた内容)を「コピペ」で使うため. だから,分割して書く際には,includeによってどこか他所にペーストしたい部分(だけ)を「ヘッダファイル」に書く. 「インクルードガード」とか呼ばれている手法は,ヘッダファイルの内容をある場所に複数回ペーストされてもコンパイル時に問題がおきないようにするための工夫.
fana

2021/02/26 02:01 編集

(…とかいうのを,回答への追記で書こうとしたが,ことごとく失敗してその都度内容が消し飛ぶのでこのコメント欄にこま切れに書いてみた. なんか最近,回答への追記がうまく行かないことが多い気がする)
txty

2021/02/28 04:52 編集

削除
fana

2021/02/26 02:40

includeによるペースト結果を手作業で再現してみることを勧めます.そうれば状況を把握できるかと.
txty

2021/02/28 04:53 編集

削除
guest

0

単なるヘッダーのインクルードです。循環インクルードや ヘッダーの衝突などの関係で仕方がなくソース部にインクルードをしないとけいなくなってしまいまいました。

いえ、使うクラスの分はソース側でincludeするのがごく当たり前だと思うのですが。

投稿2021/02/25 14:07

maisumakun

総合スコア145967

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/02/25 14:32 編集

> ソースはヘッダーどっちかにまとめるべきなのでしょうか? 「全部を1ファイルで書き進める」というやり方でなければ、両方必要です。クラス宣言は翻訳単位(≒cppファイル)ごとに必要となりますし、ヘッダオンリーで開発するにしてもヘッダだけではコンパイルできません。
guest

0

私の友人の話ですが、ALL.hなるものを作り、そこに全てのファイルをインクルードしている人がいましたが、就職してから実務でそのような場面に出会ったことがありません。

SDKやライブラリなのでは、そういう手法もありだと思いますが、基本的にそのような特殊環境でもない限り、全てをインクルードするヘッダー等は作らない方が良いです。
全てのファイルでそうですが、不要なインクルードは避けて下さい。

C++

1#include "Game_Scene.hpp" //こっちは大本のヘッダーなので読み込む意味あり 2#include "Stage.hpp" //CPP内でしか使わないのであれば、こちらでインクルードの方が良い

投稿2021/02/25 21:19

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/02/25 23:12

Visual C++だと、ちょっとやそっとでは変化しないシステムヘッダを集めた「プリコンパイルヘッダ」を作るために、システムヘッダをincludeするだけのファイルを作る、という構造になっていることはあります。
stdio

2021/02/26 01:49

必要な標準ライブラリを集めたインクルードだけのファイルは作るときはありますね(汗)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問