これに関する他のいくつかの質問を見ましたが、私の場合、なぜデフォルトのコンストラクターを呼び出さなければならないのかわかりません。デフォルトのコンストラクタを提供することもできますが、これがなぜこれを実行するのか、そしてそれが何に影響するのかを理解したいと思います。
error C2512: 'CubeGeometry' : no appropriate default constructor available
メンバー変数がCubeGeometryのProxyPieceというクラスがあります。コンストラクターはCubeGeometryを取り込んでメンバー変数に割り当てると想定されています。これがヘッダーです:
#pragma once
#include "CubeGeometry.h"
using namespace std;
class ProxyPiece
{
public:
ProxyPiece(CubeGeometry& c);
virtual ~ProxyPiece(void);
private:
CubeGeometry cube;
};
とソース:
#include "StdAfx.h"
#include "ProxyPiece.h"
ProxyPiece::ProxyPiece(CubeGeometry& c)
{
cube=c;
}
ProxyPiece::~ProxyPiece(void)
{
}
キューブジオメトリのヘッダーは次のようになります。デフォルトのコンストラクタを使用しても意味がありません。とにかく必要ですか?:
#pragma once
#include "Vector.h"
#include "Segment.h"
#include <vector>
using namespace std;
class CubeGeometry
{
public:
CubeGeometry(Vector3 c, float l);
virtual ~CubeGeometry(void);
Segment* getSegments(){
return segments;
}
Vector3* getCorners(){
return corners;
}
float getLength(){
return length;
}
void draw();
Vector3 convertModelToTextureCoord (Vector3 modCoord) const;
void setupCornersAndSegments();
private:
//8 corners
Vector3 corners[8];
//and some segments
Segment segments[12];
Vector3 center;
float length;
float halfLength;
};
デフォルトのコンストラクタは、ここで暗黙的に呼び出されます。
ProxyPiece::ProxyPiece(CubeGeometry& c)
{
cube=c;
}
あなたが欲しい
ProxyPiece::ProxyPiece(CubeGeometry& c)
:cube(c)
{
}
そうでなければ、あなたの俳優は同等です
ProxyPiece::ProxyPiece(CubeGeometry& c)
:cube() //default ctor called here!
{
cube.operator=(c); //a function call on an already initialized object
}
コロンの後のものは メンバー初期化リスト と呼ばれます。
ちなみに、私はconst CubeGeometry& c
の代わりに CubeGeomety& c
私だったら。
メンバーの初期化は、コンストラクターの開始時に行われます。コンストラクターのメンバー初期化リストに初期化子を指定しない場合、メンバーはデフォルトで作成されます。メンバーcube
の初期化に使用するコンストラクターをコピーする場合は、メンバー初期化リストを使用します。
ProxyPiece::ProxyPiece(CubeGeometry& c)
: cube(c)
{ }
コロンに続くものはすべて初期化リストです。これは単にcube
をc
で初期化する必要があることを示しています。
あなたが持っていたように、cube
メンバーは最初にデフォルトで初期化され、次にc
がコピー割り当てに初期化されました。