在子类中初始化列表

时间:2021-04-21 21:54:31

标签: c++

我正在尝试使用抽象类的构造函数。我必须在抽象类 Swiat 中存储对类 Organizmy 的引用。 Organizmy 有子类 Zwierze(也是一个抽象类),然后是 Zwierze 的另一个子类,Czlowiek。 (Organizmy (抽象) >>> Zwierze (抽象) >>> Czlowiek).

我正在尝试初始化一个向构造函数传递参数的列表。首先在 Czlowiek 类中传递给 Zwierze 构造函数,然后 Zwierze 构造函数将参数传递给 Organizm 构造函数。

这是我的代码:

组织.h

#pragma once
class Swiat;
class Organizm
{
public:
    Swiat& swiat;  //MY REFERENCE
    char symbol = '?';
    int sila = 0;
    int inicjatywa = 0;
    int* polozenie; //x y
    
    virtual void Akcja()=0;
    virtual void Kolizja()=0;
    virtual void Rysowanie()=0;
    Organizm(Swiat& swiat, char symbol, int sila, int inicjatywa, int polozenie[2]);

Organizm.cpp

#include "Organizm.h"
#include <iostream>

using namespace std;

void Organizm::Rysowanie()
{
    cout << "Hej jestem organizmem" << endl;
}

Organizm::Organizm(Swiat& swiat, char symbol, int sila, int inicjatywa, int* polozenie)
    :swiat(swiat), symbol(symbol), sila(sila), inicjatywa(inicjatywa), polozenie(polozenie) {}

Zwierze.h

#pragma once
#include "Organizm.h"
class Zwierze : public Organizm
{
public:
    void Akcja() override;
    void Kolizja() override;
    Zwierze(Swiat& swiat, char symbol, int sila, int inicjatywa, int* polozenie);
};

Zwierze.cpp

#include "Zwierze.h"

using namespace std;

void Zwierze::Akcja()
{
    //todo
}
void Zwierze::Kolizja()
{
    //todo
}

Zwierze::Zwierze(Swiat& swiat, char symbol, int sila, int inicjatywa, int* polozenie) : Organizm(swiat, symbol, sila, inicjatywa, polozenie) {}

Czlowiek.h

#pragma once
#include "Zwierze.h"

class Czlowiek : public Zwierze
{
public:
    //int polozenie[2];
    int* polozenie;
    Swiat& s;
    void Rysowanie() override;
    void Powiedz();
    Czlowiek(Swiat& swiat);
};

Czlowiek.cpp

#include "Czlowiek.h"
#include <iostream>

using namespace std;

Czlowiek::Czlowiek(Swiat& swiat) : Zwierze(swiat, 'A', 5, 4, polozenie) {}
void Czlowiek::Rysowanie()
{
    cout << "Hej, jestem czlowiekiem"<<symbol << endl;
}
void Czlowiek::Powiedz()
{
    cout << "Mam tyle sily: " << sila << endl;
}

main() 中,我只创建了 Swiat 对象,而在 Swiat 方法中正在创建新的 Czlowiek 对象:

Organizm* czlowiek = new Czlowiek(*this);

我收到的错误信息是

<块引用>

“未初始化的引用成员”(代码块)

<块引用>

"Czlowiek::s": "必须初始化引用"(视觉)

2 个答案:

答案 0 :(得分:1)

您需要像这样初始化构造函数的成员初始化列表中的成员引用Czlowiek::s

Czlowiek::Czlowiek(Swiat& swiat) :s(swiat), Zwierze(swiat, 'A', 5, 4, polozenie) {}

答案 1 :(得分:1)

您没有初始化类 sCzlowiek 成员。你可能想要这样的东西。

   Czlowiek::Czlowiek(Swiat& swiat) : Zwierze(swiat, 'A', 5, 4, polozenie), s{swiat} {}