質問編集履歴

1

追記

2021/07/23 13:14

投稿

youp
youp

スコア12

test CHANGED
File without changes
test CHANGED
@@ -185,3 +185,217 @@
185
185
  もっと簡潔に書く方法がないかと思い質問させていただきました
186
186
 
187
187
  よろしくお願いいたします
188
+
189
+
190
+
191
+ ## 追記
192
+
193
+
194
+
195
+ 質問欄より
196
+
197
+ > なぜ禁止したいのでしょうか?
198
+
199
+
200
+
201
+ 次のようなことを考えていました
202
+
203
+
204
+
205
+ クラスAは他者のコードをライブラリとして使っているため いじりたくありません(ライセンスによっては編集できない場合もある)
206
+
207
+
208
+
209
+ そのクラスAには```copy``` ```move```コンストラクタが```default```宣言されています
210
+
211
+ しかし、私は```copy``` ```move```コンストラクタも使われたくありません
212
+
213
+
214
+
215
+ なので、継承して```copy``` ```move```コンストラクタを```delete```宣言しました
216
+
217
+
218
+
219
+ 誤ってアップキャストしてしまうと↑目的が達成できません
220
+
221
+ また、classAが```virtual```デストラクタでもないためclassBが解放されない事故も起きてしまうように思います
222
+
223
+
224
+
225
+
226
+
227
+ ```cpp
228
+
229
+
230
+
231
+ struct A {
232
+
233
+ A() = default;
234
+
235
+ ~A() = default;
236
+
237
+ A(A&) = default;
238
+
239
+ A& operator=(A&) = default;
240
+
241
+ A(A&&) = default;
242
+
243
+ A& operator=(A&&) = default;
244
+
245
+
246
+
247
+ public://関数
248
+
249
+ void a() {}
250
+
251
+ void b() {}
252
+
253
+ };
254
+
255
+
256
+
257
+ //copy move を delete
258
+
259
+ struct B : public A{
260
+
261
+ B() = default;
262
+
263
+ ~B() = default;
264
+
265
+ B(B&) = delete;
266
+
267
+ B& operator=(B&) = delete;
268
+
269
+ B(B&&) = delete;
270
+
271
+ B& operator=(B&&) = delete;
272
+
273
+ };
274
+
275
+
276
+
277
+ int main(){
278
+
279
+
280
+
281
+ {
282
+
283
+ std::unique_ptr<A> test1 = std::make_unique<B>();
284
+
285
+ }//B::~Bが呼ばれない
286
+
287
+
288
+
289
+ A* test2 = new B();
290
+
291
+ delete test2;//B::~Bが呼ばれない
292
+
293
+ }
294
+
295
+
296
+
297
+ ```
298
+
299
+
300
+
301
+ よく考えたらアップキャストを禁止したところで抜け穴はありますね
302
+
303
+
304
+
305
+
306
+
307
+ ---
308
+
309
+
310
+
311
+ 回答欄より
312
+
313
+ > is a関係の派生クラスではなく、has a関係のネストクラスを使うのはどうですか?
314
+
315
+
316
+
317
+ is aとhas aについてあまり理解していませんが、それとなく機能しそうです
318
+
319
+ ありがとうございます
320
+
321
+
322
+
323
+ ```cpp
324
+
325
+ struct A {
326
+
327
+ A() = default;
328
+
329
+ ~A() = default;
330
+
331
+ A(A&) = default;
332
+
333
+ A& operator=(A&) = default;
334
+
335
+ A(A&&) = default;
336
+
337
+ A& operator=(A&&) = default;
338
+
339
+
340
+
341
+ public://関数
342
+
343
+ void a() {}
344
+
345
+ void b() {}
346
+
347
+
348
+
349
+
350
+
351
+ };
352
+
353
+
354
+
355
+ struct B {
356
+
357
+ B() = default;
358
+
359
+ ~B() = default;
360
+
361
+ B(B&) = delete;
362
+
363
+ B& operator=(B&) = delete;
364
+
365
+ B(B&&) = delete;
366
+
367
+ B& operator=(B&&) = delete;
368
+
369
+
370
+
371
+ public:
372
+
373
+ A* operator ->() noexcept {
374
+
375
+ return &a;
376
+
377
+ }
378
+
379
+
380
+
381
+ private:
382
+
383
+ A a{};
384
+
385
+
386
+
387
+ };
388
+
389
+
390
+
391
+ int main() {
392
+
393
+ B b;
394
+
395
+ b->a();
396
+
397
+ }
398
+
399
+
400
+
401
+ ```