我正在用C ++学习oop,并且遇到以下错误:
在构造函数'pflFr1 :: pflFr1()'
错误:没有匹配的函数可以调用worldBuilder :: worldBuilder()
class worldbuilder正在生成受保护的2d数组。 pflfr1类是来自worldbuilder的。但是不知何故,worldbuilder的构造函数存在问题。
我的代码:
main.cpp:
#include <iostream>
#include "pflfr1.h"
#include "worldbuilder.h"
#include <vector>
using namespace std;
int main()
{
srand(time(0));
int sl = 10;
worldBuilder w_obj(sl);
w_obj.buildPhyWelt();
w_obj.buildVegWelt();
pflFr1 objekt();
return 0;
}
worldbuilder.h:
#ifndef WORLDBUILDER_H
#define WORLDBUILDER_H
#include <vector>
using namespace std;
class worldBuilder
{
public:
worldBuilder(int sl_);
vector<vector<int> > buildPhyWelt();
vector<vector<int> > buildVegWelt();
protected:
vector<vector<int> > phyWelt;
vector<vector<int> > vegWelt;
int sl;
private:
};
#endif // WORLDBUILDER_H
worldbuilder.cpp:
#include <iostream>
#include "worldbuilder.h"
#include <vector>
using namespace std;
worldBuilder::worldBuilder(int sl_)
: sl(sl_)
{
}
vector<vector<int> > worldBuilder::buildPhyWelt()
{
phyWelt.resize(sl, vector<int>(sl));
// initialisiere physische Welt
// 1 = land, -1 ist meer
for(int i=0; i<sl; i++)
{
for(int j=0; j<sl; j++)
{
phyWelt[i][j] = 1;
}
}
}
vector<vector<int> > worldBuilder::buildVegWelt()
{
vegWelt.resize(sl, vector<int>(sl));
// initialisiere Nahrung
for(int i=0; i<sl; i++)
{
for(int j=0; j<sl; j++)
{
if(rand()%100<=2)
{
vegWelt[i][j] = 1;
}
else
{
vegWelt[i][j] = 0;
}
}
}
}
pflfr1.h:
#ifndef PFLFR1_H
#define PFLFR1_H
#include <vector>
#include "worldbuilder.h"
using namespace std;
class pflFr1: protected worldBuilder
{
public:
pflFr1();
protected:
private:
int y;
int x;
int hp;
};
#endif // PFLFR1_H
pflfr1.cpp:
#include <iostream>
#include <pflfr1.h>
#include <cstdlib>
#include <ctime>
using namespace std;
pflFr1::pflFr1()
: hp(10)
{
int initPosY = rand()%sl;
int initPosX = rand()%sl;
y = initPosY;
x = initPosX;
}
答案 0 :(得分:0)
您的默认构造函数pflFr1::pflFr1()
的实现被重写为
pflFr1::pflFr1()
: worldBuilder(), hp(10){
...
}
由于pflFr1
类是从worldBuilder
派生的,因此它的构造函数必须在pflFr1
对象创建过程中被调用。默认行为是调用基的默认构造函数-worldBuilder()
。
但是该构造函数不存在。您仅声明了worldBuilder::worldBuilder(int sl_);
。这样,您就禁用了自动为类生成默认构造函数的功能,只有在未声明用户定义的构造函数的情况下,才会这样做。
您都可以在类内部编写worldBuilder()=default;
,这将使s1
未被初始化。或者,您可以使用委托的构造函数-worldBuilder():worldBuilder(0){}
。