【发布时间】:2020-05-12 19:39:54
【问题描述】:
当我创建一个引用类 C 的类 A 对象时,类 B 给出以下错误: 错误 C2512 'A': 没有合适的默认构造函数可用
A 类
class A
{
public:
C* cPointer;
A(C* arg)
{
cPointer = arg;
}
};
B 类
class B:
public A
{
public:
B()
{
}
};
如果我向 A 类添加一个空构造函数,它不会给出错误,但是当我尝试访问 cPointer 时,它会返回一个空地址 0000000000;
A()
{
}
我该如何解决这个问题?
编辑:示例
int main()
{
C cObject;
A a(&cObject);
return 0;
}
结果:严重性代码描述项目文件行抑制状态 错误 C2512 'A': 没有合适的默认构造函数可用
正如我之前提到的,如果我将空构造函数放在 A 中,它可以工作,但我不能使用 cPointer,因为它设置为 0。 B类:
cout << "Poniter: " << cPointer << endl;
结果:
指针:0000000000000000
好的,这是实际代码:
Skill.h(例如 C 类)
#pragma once
#include <iostream>
#include <vector>
#include "Unit.h"
using namespace std;
class Skill
{
public:
Unit* unitPtr;
Skill()
{
}
Skill(Unit* unit)
{
unitPtr = unit;
}
void SetUnit(Unit* unit)
{
unitPtr = unit;
}
vector <Skill *> attacks;
vector <Skill *> utilities;
vector <Skill *> movement;
};
Unit.h(以 A 类为例)
#pragma once
#include <iostream>
#include <vector>
#include <stdlib.h>
#include <time.h>
using namespace std;
class Skill;
class Unit
{
public:
Skill* skillPtr;
Unit(Skill* skill)
{
skillPtr = skill;
}
void Setup();
string name;
vector <Unit* > heroes;
vector <Unit* > monsters;
};
Hero.h(例如 B 类)
#pragma once
#include "Unit.h"
class Hero :
public Unit
{
public:
Hero() : Unit(skillPtr)
{
cout << "Pointer: " << skillPtr << endl;
}
};
主要
int main()
{
Skill skill;
Unit unit(&skill);
skill.SetUnit(&unit);
unit.Setup();
return 0;
}
【问题讨论】:
-
在您的
Hero.h中,skillPtr中的行:Hero() : Unit(skillPtr)是什么?我没有看到它在任何地方定义。 -
默认的
Skill::Skill()构造函数没有初始化unitPtr。 -
Hero正在从Unit类继承skillPtr,当Hero试图将skillPtr传递给Unit构造函数。您有一个需要中断的循环引用,因为Hero无法访问有效的Skill来初始化Unit。此外,您的main()没有显示您尝试使用Hero的方式。另外,您可以考虑在Unit构造函数中调用Skill.SetUnit(this)。 -
啊,好电话@Remy。所以这是你的问题,Utkan。
skillPtr还没有被初始化,你正在使用它的值来调用Unit构造函数来......初始化skillPtr。你看到问题了吗?您可能想要Hero(Skill *ptr): Unit(ptr) { },以便您可以将技能指针传递给Hero以进行初始化
标签: c++ constructor