🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3418閲覧

エラー「class 'Block': コピー コンストラクターが使用できないか、'explicit' として宣言されています。」の解決方法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/02/05 02:20

編集2021/02/05 02:35

以下のエラーですがなぜexplicit でもなくコピーコンストラクタを定義しているのも関わらずこのエラーが出るのですが?どうしても理解出来ません、

試したこと「基底クラスも調べましたがexplicit で宣言しているコピーコンストラクタはありません。これはどう対処したらいいでしょうか?」

エラー C2558 class 'Block': コピー コンストラクターが使用できないか、'explicit' として宣言されています。

hpp

1#ifndef ___BLOCK_HPP 2#define ___BLOCK_HPP 3 4 5#include "Object.hpp" 6#include "MapChip.hpp" 7#include <iostream> 8#include <array> 9 10 11class Entry; 12class Block : public Object 13{ 14public: 15 16 Block(Entry* e, ObjectType type, std::shared_ptr<TextureData> data, TextureUV uv, glm::ivec2 pos); 17 Block(Block& b); 18 ~Block(); 19 20 21 void Update(); 22 void Draw(); 23 24 25private: 26 27 std::array<MapChip,4> mChip; 28 29}; 30 31

cpp

1#include "../../Header/Game/Block.hpp" 2 3 4 5// コンストラクタ 6Block::Block(Entry *e,ObjectType type ,std::shared_ptr<TextureData> data,TextureUV uv,glm::ivec2 pos) : Object(e,type) 7{ 8 9 mChip.at(0) = MapChip(e, ObjectType::Block, data, uv, pos); 10 mChip.at(1) = MapChip(e, ObjectType::Block, data, uv, pos); 11 mChip.at(2) = MapChip(e, ObjectType::Block, data, uv, pos); 12 mChip.at(3) = MapChip(e, ObjectType::Block, data, uv, pos); 13 14} 15 16// コピーコンストラクタ 17Block::Block(Block& b) 18{ 19 mChip = b.mChip; 20 Type = b.Type; 21} 22 23void Block::Update() 24{ 25 26 27 28 for (std::array<MapChip, 4>::iterator itr = mChip.begin(); itr != mChip.end(); itr++) 29 { 30 itr->Update(); 31 } 32 33} 34 35 36void Block::Draw() 37{ 38 printf("aaa\n"); 39 for (std::array<MapChip, 4>::iterator itr = mChip.begin(); itr != mChip.end(); itr++) 40 { 41 itr->Draw(); 42 } 43 44} 45 46//コンストラクタ 47Block::~Block() 48{ 49 50} 51

hpp

1#ifndef OBJECT_HPP_ 2#define OBJECT_HPP_ 3 4#include "../Actor_2D.hpp" 5 6#define CELL ((int)48) 7 8//オブジェクトタイプ 9enum class ObjectType 10{ 11 Block, 12 destryBlock, 13 Ocean, 14 Woods, 15 Item, 16 17 Invalid, 18}; 19 20/*####################################### 21* オブジェクトクラス 22#########################################*/ 23class Entry; 24class Object : public Actor_2D 25{ 26public: 27 Object(Entry* e, ObjectType t); 28 Object(); 29 Object(Object& obj); 30 ~Object(); 31 32 ObjectType getObjectType(); 33 34 35 virtual void Update(); 36 virtual void Draw(); 37 38 39protected: 40 ObjectType Type; 41 42private: 43 44 45 46}; 47 48#endif 49

cpp

1#include "../../Header/Game/Object.hpp" 2 3// コンストラクタ 4Object::Object(Entry* e, ObjectType t) : Actor_2D() 5{ 6 Owner = e; //Entry クラス 7 Type = t; //オブジェクトタイプ 8} 9 10 11Object::Object() : Actor_2D() 12{ 13 Owner = nullptr; 14 Type = ObjectType::Invalid; 15} 16 17 18//オブジェクトタイプを取得 19ObjectType Object::getObjectType() 20{ 21 return Type; 22} 23 24Object::Object(Object& obj) 25{ 26 Type = obj.Type; 27} 28 29 30void Object::Update() 31{ 32 33} 34 35void Object::Draw() 36{ 37 38} 39 40 41 42 43//デストラクタ 44Object::~Object() 45{ 46} 47 48

hpp

1#ifndef ___ACTOR_HPP__ 2#define ___ACTOR_HPP__ 3 4#include "glm/glm.hpp" 5 6 7 8 9class Actor_2D 10{ 11public: 12 Actor_2D(); //コンストラクタ 13 ~Actor_2D(); //デストラクタ 14 15 virtual void Update() = 0; 16 virtual void Draw() = 0; 17 18 19 glm::ivec2 getPostion() 20 { 21 return mPosition; 22 } 23 24 void setPosition(glm::ivec2 pos) 25 { 26 mPosition = pos; 27 } 28 29protected: 30 31 glm::ivec2 mPosition; //座標 32 glm::ivec2 mScale; //スケール 33 float mRadian; //回転 34 35 glm::ivec2 mVector; //方向 36 37 class Entry* Owner; 38private: 39}; 40 41#endif

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2021/02/05 02:41

そのエラーがどこで出たんですか?
退会済みユーザー

退会済みユーザー

2021/02/05 02:43

提示コードにはありませんがそれを使ってるStageクラスです。 std::array<Block,4> arr などと宣言したらこのエラーが出ます。どうしたらいいのでしょうか?
episteme

2021/02/05 02:46

> 提示コードにはありませんが 質問ヘタクソ。 どこで/どんな問題なのかを示さんと答えられんでしょうに。
guest

回答1

0

ベストアンサー

c++

1 Block(Block& b);

これはコピーコンストラクタではありません。constを付ける必要があります。

c++

1 Block(const Block& b);

ちなみに、ゲームなどで画面に見えるパーツを表すクラスは、ふつうコピー可能にはしません。1つのパーツを表すインスタンスが複数存在してはおかしいのと、画面に表示するために大きなリソースを抱えていることがあってコピーコストが高いからです。
(※個人の経験からくる感想です)

投稿2021/02/05 02:42

編集2021/02/05 03:54
int32_t

総合スコア21679

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/02/05 02:46

なるほど。質問ですが。 一個上のクラスでこのように使っているのですが本来はどうするべきなのでしょうか? block.push_back(Block(e,ObjectType::destryBlock,data,uv,glm::ivec2(0,0)));
episteme

2021/02/05 02:49

Blockがコピーできないなら block.emplace_back(e,ObjectType::destryBlock,data,uv,glm::ivec2(0,0)); じゃなくて?
int32_t

2021/02/05 03:39

本当にコピー不可にすべきかどうかは私はわからないですよ。 もしコピー不可にするなら、型を std::vector<std::unique_ptr<Block>> などにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問