AAB
AAB

Reputation: 714

"No appropriate default constructor available"--Why is the default constructor even called?

I've looked at a few other questions about this, but I don't see why a default constructor should even be called in my case. I could just provide a default constructor, but I want to understand why it is doing this and what it affects.

error C2512: 'CubeGeometry' : no appropriate default constructor available  

I have a class called ProxyPiece with a member variable of CubeGeometry.The constructor is supposed to take in a CubeGeometry and assign it to the member variable. Here is the header:

#pragma once
#include "CubeGeometry.h"

using namespace std;
class ProxyPiece
{
public:
    ProxyPiece(CubeGeometry& c);
    virtual ~ProxyPiece(void);
private:
    CubeGeometry cube;
};

and the source:

#include "StdAfx.h"
#include "ProxyPiece.h"

ProxyPiece::ProxyPiece(CubeGeometry& c)
{
    cube=c;
}


ProxyPiece::~ProxyPiece(void)
{
}

the header for cube geometry looks like this. It doesn't make sense to me to use a default constructor. Do I need it anyways?:

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

Upvotes: 20

Views: 40037

Answers (2)

Armen Tsirunyan
Armen Tsirunyan

Reputation: 133112

Your default constructor is implicitly called here:

ProxyPiece::ProxyPiece(CubeGeometry& c)
{
    cube=c;
}

You want

ProxyPiece::ProxyPiece(CubeGeometry& c)
   :cube(c)
{
    
}

Otherwise your ctor is equivalent to

ProxyPiece::ProxyPiece(CubeGeometry& c)
    :cube() //default ctor called here!
{
    cube.operator=(c); //a function call on an already initialized object
}

The thing after the colon is called a member initialization list.

Incidentally, I would take the argument as const CubeGeometry& c instead of CubeGeomety& c if I were you.

Upvotes: 40

Joseph Mansfield
Joseph Mansfield

Reputation: 110768

Member initialization occurs when the constructor begins. If you do not provide an initializer in the constructor's member initialization list, the member will be default constructed. If you want to copy constructor to be used to initialize the member cube, use the member initialization list:

ProxyPiece::ProxyPiece(CubeGeometry& c)
  : cube(c)
{ }

Everything following the colon is the initialization list. This simply says that cube should be initialized with c.

As you had it, the cube member was first default initialized and then c was copy assigned to it.

Upvotes: 9

Related Questions