<iostream>
これはdog.cppにてinclude.
dog.hをincludeする側に<iostream>を強制的にincludeさせる理由が全く無いので.
Cat.h
これは状況次第.
仮に,dogクラスのメンバであるCat *cat;
がprivateだったならば,dog.cppにてinclude.
その理由は<iostream>と同じ.
しかし,現状はpublicなので,dogクラスを利用する側がCatクラスの定義を必要とする場合にはCat.hをincludeする必要が生じる.
これを,
dog.hに #include "Cat.h"
とか書いておくことで面倒が無いようにしておくか,
それとも,dog.h の利用側が必要に応じて Cat.h をincludeするという話にするのかは,方針に依る.
[補足追記]
※何やら他者の回答のコメント欄にて「privateがどうの」という騒ぎが起きているのは
この私の回答のせいなのかもしれない(?)ので,念のため補足しておく.
もしも,Dogクラスがこのような形だったとしたら…
C++
1//dog.h
2class Cat;
3
4class Dog
5{
6//publicかprivateかはともかくとして
7 Cat cat; //Cat型のメンバ変数
8};
メンバ変数cat が publicだろうがprivateだろうが,Cat型の定義を与えないとコンパイルエラーになる.
「Cat型ってのは何なんだよ?」というわけだ.
このdog.hをincludeする場所ではCat型の定義が必ず必要(≒Cat.hのincludeが必要).
(この場合,include順とかも面倒だし,dog.hに#include "Cat.h"
とか書いておくのがまぁ無難であろう.)
しかし本件の例では,メンバはCat型ではなくて Cat *cat;
である.
C++
1//dog.h
2class Cat;
3
4class Dog
5{
6//publicかprivateかはともかくとして
7 Cat *cat; //Cat型ではなく Cat*
8};
「"Cat"っていうのは,何らかのclassの型名なんだけどさー」(←前方宣言による)
「で,Cat*型のポインタ変数catがあってさー」
というだけの話をしている限りは,Cat型の具体的な定義が無くても良いから,とりあえずはコンパイルエラーにはならない.(つまり,Cat.hのincludeはとりあえず必要ではない)
↓
で,この回答で「privateが云々」と言っているのは,
【もしも cat がprivateであれば,dog.hをincludeしてDogクラスを使う側では cat に触れることは無いハズなのだから,Cat型の定義が追加で必要になることも無い(Cat.hのincludeが必要になることは無い)ハズ】
という話.
Dogクラスを使う側では Cat.hのinclude が必要になることは無いハズなのだから,dog.hに#include "Cat.h"
とか書いても何の利便性ももたらさないし,
それどころかこれを書いてしまうと,余計な依存関係を作り出してしまうから,書くべきではない.
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/17 12:25
2021/03/18 01:25
2021/03/18 07:16
2021/03/18 07:21