web-dev-qa-db-ja.com

暗黙的に削除されたデフォルトコンストラクターの呼び出し

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;
}

誰かがここで何が問題なのか教えてもらえますか?私は似たようなトピックを見つけましたが、実際には同じではなく、与えられた説明が理解できませんでした。

ありがとう。

9
Itsbananas

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 = xy = yz = zは意味がありません。変数を自分自身に割り当てています。 this->x = xはそれを修正する1つのオプションですが、よりc ++スタイルのオプションは、cpと同様にイニシャライザリストを使用することです。 this->x = xを使用せずに、パラメーターとメンバーに同じ名前を使用できます。

Point3D::Point3D(float x, float y, float z)
    : x(x)
    , y(y)
    , z(z)
{}
13
xcvr