Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"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;
};
like image 572
AAB Avatar asked Mar 29 '13 19:03

AAB


People also ask

What if there is no default constructor available?

Because there is no default constructor available in B, as the compiler error message indicates. Once you define a constructor in a class, the default constructor is not included. If you define *any* constructor, then you must define *all* constructors.

Is default constructor always called?

This constructor is called the default constructor because it is run "by default;" if there is no initializer, then this constructor is used. The default constructor is used regardless of where a variable is defined.

Why is default constructor necessary?

What is the significance of the default constructor? They are used to create objects, which do not have any specific initial value. Is a default constructor automatically provided? If no constructors are explicitly declared in the class, a default constructor is provided automatically by the compiler.

Can a class have no default constructor?

No default constructor is created for a class that has any constant or reference type members.


2 Answers

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.

like image 79
Armen Tsirunyan Avatar answered Sep 22 '22 13:09

Armen Tsirunyan


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.

like image 43
Joseph Mansfield Avatar answered Sep 25 '22 13:09

Joseph Mansfield