質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

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

Q&A

解決済

2回答

3549閲覧

VC++ #includeとclassの違い

Utaka

総合スコア7

C++

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

0グッド

0クリップ

投稿2018/02/13 00:14

AppMainクラスからAppSubクラスを利用する場合に、ヘッダーに#include "AppSub.h"と宣言します。
AppMainクラス全体でAppSubクラスを参照できるようになります。

しかしあるソースではヘッダーで下記のように宣言し、

cpp

1#include "stdafx.h" 2 3class CAppSub; 4 5class CAppMain 6{ 7... 8}

ソースで今一度AppSubクラスをインクルードしています。

cpp

1#include "stdafx.h" 2#include "AppSub.h" 3 4CAppMain::CAppMain() 5{ 6... 7}

ヘッダーでインクルードしておけばソースで再度宣言する必要がないのに、なぜこのようにするのか理解できません。
どなたかご教授をお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ヘッダーでインクルードしておけばソースで再度宣言する必要がないのに、なぜこのようにするのか理解できません。

「詳細を隠したい」という意図の現れでもあります。
この例でいけば、「CAppMainの利用者にはCAppSubのナカミを意識して欲しくない」ってこと。

#include "CAppSub.h" しなければCAppSubに変更が生じてもCAppMain利用者コードは再コンパイル不要。詳細を隠すことによるメリットやね。

(CAppMain.cppはCAppSubの詳細がなくては実装できんので#includeするけど。)

[追記]
もうひとつ、**たすき掛け(相互参照)**のため。

C++

1// 旦那.h 2#include "嫁.h" 3class 旦那 { 4* 相方; 5};

C++

1// 嫁.h 2#include "旦那.h" 3class 嫁 { 4 旦那* 相方; 5};

これ、コンパイルできません。無限に#includeすることになるぢゃろ?
こんなときに

C++

1// 旦那.h 2class 嫁; 3 4class 旦那 { 5* 相方; 6}; 7

投稿2018/02/13 00:56

編集2018/02/13 10:49
episteme

総合スコア16614

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

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

Utaka

2018/02/13 01:24

回答ありがとうございます。 > CAppMainの利用者にはCAppSubのナカミを意識して欲しくない う~ん、“詳細を隠したい”というのは具体的にどういう状況でしょうか? コーディングの手間どうこうではなく、ヘッダーは宣言の場なので型が認識できて宣言できれいれば良いという感じでしょうか?
episteme

2018/02/13 01:33 編集

たとえば、だ。 - CAppSub.h が 1万行あるとする。利用者に#includeさせたいか? - CAppsub.hはその中でさらに50本のヘッダを#includeしてる。利用者に#includeさせたいか? - CAppSub.h は開発中でその内容がコロコロ変わる。そのたびに利用者に再コンパイルさせたいか? - CAppSub.h には驚くべきテクニックが満載でそれだけでも金になる。タダで利用者に公開するか?
Utaka

2018/02/13 01:55

度々の回答ありがとうございます。 #includeとclassの違いがなんとなく理解できました。 最後にもう少し教えてください。 > CAppSub.h には驚くべきテクニックが満載でそれだけでも金になる。タダで利用者に公開するか? この公開とは、ヘッダーでincludeしてしまうとAppSubクラス全体が見えるようになるということでしょうか。それはどのように確認できますか? また、ソースでincludeした場合は非公開になるということですか?
episteme

2018/02/13 01:59

利用者には, CAppSub.h は当然見える。CAppSub.cppは実装者が公開しない限り見えない。 ヘッダの中に重要機密事項を書かんわけにはいかんってとき、#includeしないことによってCAppSub.hを非公開とする。 ※ もうひとつの用途を追記しました
guest

0

しかしあるソースではヘッダーで下記のように宣言し、

class CAppSub;だけでは不完全型といって、「こういう型がある」ことしか宣言できていません。そのため、不完全型に対して(参照やポインタでない)変数を宣言する、メソッドを呼ぶなどのことはできません。

実際に利用するには、ヘッダーのインクルードが必要不可欠ですので、class CAppMainの宣言の側でも#include "AppSub.h"をしておいたほうがいいでしょう。

class CAppSub;のように不完全型を宣言すべき場面は、複数のクラスが相互参照しているために、先に片方を宣言せざるを得ない場面など、けっこう限られています。

投稿2018/02/13 00:30

maisumakun

総合スコア145183

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

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

maisumakun

2018/02/13 00:40 編集

C++の場合、コンパイルは「1ファイル単位」で進みますので、型の宣言は#includeを使ってソースファイルに展開しておかないと、処理できません。
Utaka

2018/02/13 01:04

回答ありがとうございます。 class CAppSub;の利点がいまいち分かりません。 結局ソースで参照が必要になって#includeするのだから2度手間ですよね。
maisumakun

2018/02/13 01:07

epistemeさんの回答のように、「class CAppMainを使う側にCAppSubの中身を見せないようにする」という点はメリットになるかもしれません。 (自分が書いた例は、文法上前方宣言がどうしても必要になってしまうものです)
episteme

2018/02/13 01:11 編集

CAppMainの利用者にとってはCAppSubの詳細は不要なら、利用者目線では #include "CAppSub.h" は不要。だから #include せずに class CAppSub で済ます。こうしておけば CAppSub.h に変更が生じてもCAppMain利用者コードは再コンパイル不要。
Utaka

2018/02/13 01:33

> こうしておけば CAppSub.h に変更が生じてもCAppMain利用者コードは再コンパイル不要。 なるほど。再コンパイル時に影響してくるのですね。 この辺りを詳しく知りたいのですが、ネットで検索するときにどういったキーワードを使えばいいでしょうか。 「C++ #include class」などでは継承関連の内容しかヒットしないもので・・・。
episteme

2018/02/13 01:38 編集

#include"ほげほげ"は「その場所に ほげほげ を書き下せ」ってことだ。...ってことを理解してるなら ほげほげ に変更が生じれば再コンパイルが必要なのはアタリマエ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問