繁体   English   中英

派生类的构造函数调用基类的构造函数

[英]Constructor of derived class calling constructor of base class

在下面的代码中,当我尝试创建Obiektstatyczny的对象时,会Obiektstatyczny Miasto (基类)的构造函数。

class Miasto
{
    public:
    Miasto();
    int rozmiar;
};


class Obiektstatyczny :public Miasto
{
    std::vector <Obiektstatyczny> blokowisko;
    int x, y;
public: 
    Obiektstatyczny();
};


Obiektstatyczny::Obiektstatyczny()
{
    for (int i = 2; i < rozmiar; i++)
        for (int j = 2; j < rozmiar; j++)
            blokowisko.push_back(Blok(i, j));
}

Miasto::Miasto()
{
    cin >> iloscBlokow;
    cin >> szerokoscBloku;
    rozmiar = iloscBlokow*szerokoscBloku;

    mapa.assign(rozmiar, vector<int>(rozmiar));
    bufor.assign(rozmiar, vector<int>(rozmiar));

    for (int i = 0; i<rozmiar; i++)
        for (int j = 0; j < rozmiar; j++)
            mapa[i][j]=bufor[i][j]=0;
}

我认为原因是我试图自己创建新的Obiektstatyczny对象,而不是通过基类,因此程序不断重复。 但是,我不知道如何正确执行此操作。 我这样做的尝试失败了。

我尝试在包含ObiektstatycznyMiasto类中创建一个字段,然后在Miasto的方法中对其进行初始化,但出现“未知覆盖说明符”错误。

Obiektstatyczny obj;
void initializeObj()
    {
        obj = Obiektstatyczny();
    }

你有的是这个:

struct X
{
    std::vector<X> stuff;
    X();
}

也就是说,一个对象包含一组相同类型的对象。 这不是一个直接的问题,但你需要小心这样的代码。

如果在构造函数中创建一个非空列表

X::X()
{
    stuff.push_back(X());
    stuff.push_back(X());
    stuff.push_back(X());
    stuff.push_back(X());
}

这会产生一个逻辑错误:要创建一个对象,您需要创建 4 个对象; 要制作这些对象中的每一个,您需要制作 4 个其他对象,...

如果构造函数没有用实际对象填充vector ,并将其留空,则不会立即出现问题。 因此,您可能希望将生成非空列表的代码移动到单独的函数 eh init() 或者一个单独的构造函数:

X::X()
{
    // leave stuff empty
}

X::X(size_t size)
{
    for (size_t i = 0; i < size; ++i)
        stuff.push_back(X()); // each of the created objects has empty stuff
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM