C++プロジェクトをコンパイルしようとすると、エラーメッセージ'std :: array'の暗黙的に削除されたデフォルトコンストラクターへの呼び出しが表示されます。
ヘッダーファイルcubic_patch.hpp
#include <array>
class Point3D{
public:
Point3D(float, float, float);
private:
float x,y,z;
};
class CubicPatch{
public:
CubicPatch(std::array<Point3D, 16>);
std::array<CubicPatch*, 2> LeftRightSplit(float, float);
std::array<Point3D, 16> cp;
CubicPatch *up, *right, *down, *left;
};
ソースファイルcubic_patch.cpp
#include "cubic_patch.hpp"
Point3D::Point3D(float x, float y, float z){
x = x;
y = y;
z = z;
}
CubicPatch::CubicPatch(std::array<Point3D, 16> CP){// **Call to implicitly-deleted default constructor of 'std::arraw<Point3D, 16>'**
cp = CP;
}
std::array<CubicPatch*, 2> CubicPatch::LeftRightSplit(float tLeft, float tRight){
std::array<CubicPatch*, 2> newpatch;
/* No code for now. */
return newpatch;
}
誰かがここで何が問題なのか教えてもらえますか?私は似たようなトピックを見つけましたが、実際には同じではなく、与えられた説明が理解できませんでした。
ありがとう。
2つのこと。クラスメンバーは初期化されますbeforeコンストラクターの本体。デフォルトのコンストラクターは引数のないコンストラクターです。
コンパイラーにcpの初期化方法を指示しなかったため、std::array<Point3D, 16>
のデフォルトコンストラクターを呼び出そうとしますが、Point3D
のデフォルトコンストラクターがないため、コンストラクターはありません。
CubicPatch::CubicPatch(std::array<Point3D, 16> CP)
// cp is attempted to be initialized here!
{
cp = CP;
}
これを回避するには、コンストラクター定義で初期化リストを指定します。
CubicPatch::CubicPatch(std::array<Point3D, 16> CP)
: cp(CP)
{}
また、このコードを確認することもできます。
Point3D::Point3D(float x, float y, float z){
x = x;
y = y;
z = z;
}
x = x
、y = y
、z = z
は意味がありません。変数を自分自身に割り当てています。 this->x = x
はそれを修正する1つのオプションですが、よりc ++スタイルのオプションは、cp
と同様にイニシャライザリストを使用することです。 this->x = x
を使用せずに、パラメーターとメンバーに同じ名前を使用できます。
Point3D::Point3D(float x, float y, float z)
: x(x)
, y(y)
, z(z)
{}