回答編集履歴

1

補足を追記

2021/03/18 02:24

投稿

fana
fana

スコア11985

test CHANGED
@@ -29,3 +29,107 @@
29
29
  dog.hに `#include "Cat.h"` とか書いておくことで面倒が無いようにしておくか,
30
30
 
31
31
  それとも,dog.h の利用側が必要に応じて Cat.h をincludeするという話にするのかは,方針に依る.
32
+
33
+
34
+
35
+ ---
36
+
37
+
38
+
39
+ ---
40
+
41
+
42
+
43
+ **[補足追記]**
44
+
45
+
46
+
47
+ ※何やら他者の回答のコメント欄にて「privateがどうの」という騒ぎが起きているのは
48
+
49
+ この私の回答のせいなのかもしれない(?)ので,念のため補足しておく.
50
+
51
+
52
+
53
+ もしも,Dogクラスがこのような形だったとしたら…
54
+
55
+
56
+
57
+ ```C++
58
+
59
+ //dog.h
60
+
61
+ class Cat;
62
+
63
+
64
+
65
+ class Dog
66
+
67
+ {
68
+
69
+ //publicかprivateかはともかくとして
70
+
71
+ Cat cat; //Cat型のメンバ変数
72
+
73
+ };
74
+
75
+ ```
76
+
77
+
78
+
79
+ メンバ変数cat が publicだろうがprivateだろうが,Cat型の定義を与えないとコンパイルエラーになる.
80
+
81
+ 「Cat型ってのは何なんだよ?」というわけだ.
82
+
83
+ このdog.hをincludeする場所ではCat型の定義が必ず必要(≒Cat.hのincludeが必要).
84
+
85
+ (この場合,include順とかも面倒だし,dog.hに`#include "Cat.h"`とか書いておくのがまぁ無難であろう.)
86
+
87
+
88
+
89
+ しかし本件の例では,メンバはCat型ではなくて `Cat *cat;` である.
90
+
91
+
92
+
93
+ ```C++
94
+
95
+ //dog.h
96
+
97
+ class Cat;
98
+
99
+
100
+
101
+ class Dog
102
+
103
+ {
104
+
105
+ //publicかprivateかはともかくとして
106
+
107
+ Cat *cat; //Cat型ではなく Cat*
108
+
109
+ };
110
+
111
+ ```
112
+
113
+
114
+
115
+ 「"Cat"っていうのは,何らかのclassの型名なんだけどさー」(←前方宣言による)
116
+
117
+ 「で,Cat*型のポインタ変数catがあってさー」
118
+
119
+ というだけの話をしている限りは,Cat型の具体的な定義が無くても良いから,とりあえずはコンパイルエラーにはならない.(つまり,Cat.hのincludeはとりあえず必要ではない)
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+ で,この回答で「privateが云々」と言っているのは,
128
+
129
+ 【もしも cat がprivateであれば,dog.hをincludeしてDogクラスを使う側では cat に触れることは無いハズなのだから,Cat型の定義が追加で必要になることも無い(Cat.hのincludeが必要になることは無い)ハズ】
130
+
131
+ という話.
132
+
133
+ Dogクラスを使う側では Cat.hのinclude が必要になることは無いハズなのだから,dog.hに`#include "Cat.h"`とか書いても何の利便性ももたらさないし,
134
+
135
+ それどころかこれを書いてしまうと,余計な依存関係を作り出してしまうから,書くべきではない.