teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

修正と追記

2017/09/28 13:55

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -78,7 +78,7 @@
78
78
 
79
79
  ```C++
80
80
  /* B.hpp */
81
- class A
81
+ class A;
82
82
 
83
83
  class B {
84
84
  private:
@@ -95,4 +95,7 @@
95
95
  void B::run2() {
96
96
  a->run3();
97
97
  }
98
- ```
98
+ ```
99
+
100
+ ついでにusing namespace std;を排除しました。
101
+ 使い方を間違えると、名前空間の利益をぶっ壊すので...

2

追記

2017/09/28 13:55

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -43,4 +43,56 @@
43
43
  逆に言うと、**『クラスである』**という情報を過ぎる次の操作は出来ません。
44
44
  - 実体の宣言
45
45
  - メンバ変数の参照
46
- - メンバ関数の参照/呼び出し
46
+ - メンバ関数の参照/呼び出し
47
+
48
+ ---
49
+ 実際に組むときは、クラス宣言と実装を分離することで回避できます。
50
+ ```C++
51
+ /* A.hpp */
52
+ // クラスBの前方宣言
53
+ class B;
54
+
55
+ // クラスAの定義
56
+ class A {
57
+ private:
58
+ B *b;
59
+
60
+ public:
61
+ void run1();
62
+ void run3();
63
+ };
64
+ ```
65
+
66
+ ```C++
67
+ /* A.cpp */
68
+ #include "A.hpp"
69
+ #include <iostream>
70
+
71
+ void A::run1() {
72
+ b->run2();
73
+ }
74
+ void A::run3() {
75
+ std::cout << "finished" << std::endl;
76
+ }
77
+ ```
78
+
79
+ ```C++
80
+ /* B.hpp */
81
+ class A
82
+
83
+ class B {
84
+ private:
85
+ A *a;
86
+ public:
87
+ void run2();
88
+ };
89
+ ```
90
+
91
+ ```C++
92
+ /* B.cpp */
93
+ #include "B.hpp"
94
+
95
+ void B::run2() {
96
+ a->run3();
97
+ }
98
+ ```

1

追記

2017/09/28 13:53

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -37,4 +37,10 @@
37
37
  A a;
38
38
  a.run1();
39
39
  }
40
- ```
40
+ ```
41
+
42
+ クラスを前方宣言することで**『クラスである』**という情報を前もって与えられます。
43
+ 逆に言うと、**『クラスである』**という情報を過ぎる次の操作は出来ません。
44
+ - 実体の宣言
45
+ - メンバ変数の参照
46
+ - メンバ関数の参照/呼び出し