但错误指向是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.
'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) {} //注意这里
};
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;
}
当然你也可以给父类的构造函数添加一个默认值
例如:
#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) // 给基类构造函数传递参数的方式
{
;
}
而 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);
};
{
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);//这是显式的调用方法
}
例如:
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.
'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) {} //注意这里
};
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;
}
当然你也可以给父类的构造函数添加一个默认值
例如:
#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) // 给基类构造函数传递参数的方式
{
;
}
而 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);
};
{
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);//这是显式的调用方法
}
例如:
class A
{
A(int k);
}
class B:public A
{
B(int k):A(k);//这是隐式的调用方法
}
class B:public A
{
B():A(2);//这是显式的调用方法
}