继承一个类,编译出现no appropriate default constructor available,为什么啊?

时间:2020-12-27 18:57:08
我在编译通过的一个工程里加了一个类B继承工程中已有的一个类A,类A只有一个带参数的构造函数,编译时会提示error C2512: 'A' : no appropriate default constructor available
但错误指向是B类的构造函数,B类只是一个简单的继承,其他什么都没写,不知道为什么报这样的错,大哥门帮忙解决一下为什么??谢谢!

8 个解决方案

#1


Compiler Error C2512
'identifier' : no appropriate default constructor available

No default constructor was available for the specified class, structure, or union.

The compiler will supply a default constructor only if user-defined constructors are not provided. If you provide a constructor that takes a nonvoid parameter, then you must also provide a default constructor. The default constructor can be called with no parameters, that is, a constructor with default values for all parameters.

#2


因为你的B类构造的时候,要先构造了父类,即A类,但A类只有一个带参的构造函数``所以B类构造时,要显示构造A类``如下:
class A
{
public:
A(int k) {}
};

class B : public A
{
public:
B() : A(1) {} //注意这里
};

#3


因为在构造子类对象时,需要先构造父类对象(除非没有父类)。因此需要在子类的构造函数中对父类进行初始化。就像楼上所做的。
当然你也可以给父类的构造函数添加一个默认值
例如:
#include<iostream>
using namespace std;

class A
{
public:
A(int k=1) {}//这里给K加了个默认值
};

class B : public A
{
public:
//B() : A(1) {} //注意这里
B() {}
};
int main()
{
B   b;
return 0;
}

#4


既然 A 的构造函数需要一个参数,
而 B 继承自A, 所以B的构造函数会提前调用A的构造函数(编译器调的),
因而,B的构造函数需要给A的构造函数传递一个参数。
一般用下面的格式

// X.h
class A
{
 public:
  A(int k);
};

class B
{
 public:
  B(int k);
};

// X.cpp
#include "X.h"
A::A(int k)
{
 ;
}

B::B(int k)
 : A(k)  // 给基类构造函数传递参数的方式
{
 ;


#5


class B
{
 public:
  B(int k);
};

应该
class B : public A
{
 public:
  B(int k);
};

#6


我也碰到了类似问题,不小心把默认构造函数删掉了

#7


2楼NB

#8


如果父类的构造函数是带参数的,那么有两种继承的方法,一种是显示的一种是隐式的
例如:
class A
{
A(int k);
}
class B:public A
{
B(int k):A(k);//这是隐式的调用方法
}

class B:public A
{
B():A(2);//这是显式的调用方法
}

#1


Compiler Error C2512
'identifier' : no appropriate default constructor available

No default constructor was available for the specified class, structure, or union.

The compiler will supply a default constructor only if user-defined constructors are not provided. If you provide a constructor that takes a nonvoid parameter, then you must also provide a default constructor. The default constructor can be called with no parameters, that is, a constructor with default values for all parameters.

#2


因为你的B类构造的时候,要先构造了父类,即A类,但A类只有一个带参的构造函数``所以B类构造时,要显示构造A类``如下:
class A
{
public:
A(int k) {}
};

class B : public A
{
public:
B() : A(1) {} //注意这里
};

#3


因为在构造子类对象时,需要先构造父类对象(除非没有父类)。因此需要在子类的构造函数中对父类进行初始化。就像楼上所做的。
当然你也可以给父类的构造函数添加一个默认值
例如:
#include<iostream>
using namespace std;

class A
{
public:
A(int k=1) {}//这里给K加了个默认值
};

class B : public A
{
public:
//B() : A(1) {} //注意这里
B() {}
};
int main()
{
B   b;
return 0;
}

#4


既然 A 的构造函数需要一个参数,
而 B 继承自A, 所以B的构造函数会提前调用A的构造函数(编译器调的),
因而,B的构造函数需要给A的构造函数传递一个参数。
一般用下面的格式

// X.h
class A
{
 public:
  A(int k);
};

class B
{
 public:
  B(int k);
};

// X.cpp
#include "X.h"
A::A(int k)
{
 ;
}

B::B(int k)
 : A(k)  // 给基类构造函数传递参数的方式
{
 ;


#5


class B
{
 public:
  B(int k);
};

应该
class B : public A
{
 public:
  B(int k);
};

#6


我也碰到了类似问题,不小心把默认构造函数删掉了

#7


2楼NB

#8


如果父类的构造函数是带参数的,那么有两种继承的方法,一种是显示的一种是隐式的
例如:
class A
{
A(int k);
}
class B:public A
{
B(int k):A(k);//这是隐式的调用方法
}

class B:public A
{
B():A(2);//这是显式的调用方法
}