【问题标题】:Empty constructor and value passing problem空构造函数和值传递问题
【发布时间】: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 类继承 skillPtrHero 试图将 skillPtr 传递给Unit 构造函数。您有一个需要中断的循环引用,因为Hero 无法访问有效的Skill 来初始化Unit。此外,您的main() 没有显示您尝试使用Hero 的方式。另外,您可以考虑在Unit 构造函数中调用Skill.SetUnit(this)
  • 啊,好电话@Remy。所以这是你的问题,Utkan。 skillPtr 还没有被初始化,你正在使用它的值来调用Unit 构造函数来......初始化skillPtr。你看到问题了吗?您可能想要Hero(Skill *ptr): Unit(ptr) { },以便您可以将技能指针传递给Hero 以进行初始化

标签: c++ constructor


【解决方案1】:
class B: public A {
    B() { }
}

当调用子类的构造函数时,它首先通过调用父构造函数来初始化其父部分。由于您没有在此处指定一个,B 构造函数正在尝试调用默认的 A 构造函数,但一个不存在!

要显式调用你创建的构造函数,你可以这样做:

class B: public A {
    B(): A(Some_C_Pointer) { }
}

【讨论】:

  • 现在它没有给出错误,我相信它正在工作,但指针仍然返回 0000000000。问题的原因可能是什么?
  • 或者给B()一个C*参数,然后B()可以将它原样传递给A(),例如:B(C* arg): A(arg) { }
  • @UtkanSüzmetaş 您显然没有正确初始化指针,即使给出了您的建议。您需要将指针初始化为指向 some 有效的C 对象。请编辑您的问题以提供minimal reproducible example 显示您实际在做的所有事情。例如,您实际上是如何使用B 的?我们看不到。
  • @RemyLebeau 好的,我添加了实际代码,也有 Hero 和 Monster 的子类,但我认为它们在我们的例子中并不重要,我还删除了像“int health;”这样的变量因为它们是无关的。
猜你喜欢
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多