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

質問編集履歴

1

追記

2021/07/23 13:14

投稿

youp
youp

スコア12

title CHANGED
File without changes
body CHANGED
@@ -91,4 +91,111 @@
91
91
  ---
92
92
 
93
93
  もっと簡潔に書く方法がないかと思い質問させていただきました
94
- よろしくお願いいたします
94
+ よろしくお願いいたします
95
+
96
+ ## 追記
97
+
98
+ 質問欄より
99
+ > なぜ禁止したいのでしょうか?
100
+
101
+ 次のようなことを考えていました
102
+
103
+ クラスAは他者のコードをライブラリとして使っているため いじりたくありません(ライセンスによっては編集できない場合もある)
104
+
105
+ そのクラスAには```copy``` ```move```コンストラクタが```default```宣言されています
106
+ しかし、私は```copy``` ```move```コンストラクタも使われたくありません
107
+
108
+ なので、継承して```copy``` ```move```コンストラクタを```delete```宣言しました
109
+
110
+ 誤ってアップキャストしてしまうと↑目的が達成できません
111
+ また、classAが```virtual```デストラクタでもないためclassBが解放されない事故も起きてしまうように思います
112
+
113
+
114
+ ```cpp
115
+
116
+ struct A {
117
+ A() = default;
118
+ ~A() = default;
119
+ A(A&) = default;
120
+ A& operator=(A&) = default;
121
+ A(A&&) = default;
122
+ A& operator=(A&&) = default;
123
+
124
+ public://関数
125
+ void a() {}
126
+ void b() {}
127
+ };
128
+
129
+ //copy move を delete
130
+ struct B : public A{
131
+ B() = default;
132
+ ~B() = default;
133
+ B(B&) = delete;
134
+ B& operator=(B&) = delete;
135
+ B(B&&) = delete;
136
+ B& operator=(B&&) = delete;
137
+ };
138
+
139
+ int main(){
140
+
141
+ {
142
+ std::unique_ptr<A> test1 = std::make_unique<B>();
143
+ }//B::~Bが呼ばれない
144
+
145
+ A* test2 = new B();
146
+ delete test2;//B::~Bが呼ばれない
147
+ }
148
+
149
+ ```
150
+
151
+ よく考えたらアップキャストを禁止したところで抜け穴はありますね
152
+
153
+
154
+ ---
155
+
156
+ 回答欄より
157
+ > is a関係の派生クラスではなく、has a関係のネストクラスを使うのはどうですか?
158
+
159
+ is aとhas aについてあまり理解していませんが、それとなく機能しそうです
160
+ ありがとうございます
161
+
162
+ ```cpp
163
+ struct A {
164
+ A() = default;
165
+ ~A() = default;
166
+ A(A&) = default;
167
+ A& operator=(A&) = default;
168
+ A(A&&) = default;
169
+ A& operator=(A&&) = default;
170
+
171
+ public://関数
172
+ void a() {}
173
+ void b() {}
174
+
175
+
176
+ };
177
+
178
+ struct B {
179
+ B() = default;
180
+ ~B() = default;
181
+ B(B&) = delete;
182
+ B& operator=(B&) = delete;
183
+ B(B&&) = delete;
184
+ B& operator=(B&&) = delete;
185
+
186
+ public:
187
+ A* operator ->() noexcept {
188
+ return &a;
189
+ }
190
+
191
+ private:
192
+ A a{};
193
+
194
+ };
195
+
196
+ int main() {
197
+ B b;
198
+ b->a();
199
+ }
200
+
201
+ ```