【问题标题】:Constructor of derived class calling constructor of base class派生类的构造函数调用基类的构造函数
【发布时间】:2018-07-16 00:09:31
【问题描述】:

在以下代码中,当我尝试创建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();
    }

【问题讨论】:

  • 我不完全明白你的问题有什么令人惊讶的地方?基类构造函数当然是在派生类构造函数进入之前调用的。没有必要 new 一个 超类实例,你尝试这样做会导致无限递归。
  • 这就是应该发生的事情。 “惨遭失败”不是问题描述。我不知道您所说的“不通过基类”是什么意思。

标签: c++ object constructor default-constructor


【解决方案1】:

你拥有的是这样的:

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,并将其留空,则不会立即出现问题。因此,您可能希望将生成非空列表的代码移动到单独的函数中,例如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
}

【讨论】:

  • 这似乎可以解决我的问题。有没有办法将std::vector&lt;X&gt; stuff 从派生类移动到基类,而不会得到 未声明的标识符不是参数的有效模板类型参数
  • 您可能想为此提出一个单独的问题。和这个问题无关。确保您提供minimal reproducible example,这样人们就不必猜测您的实际问题是什么。
猜你喜欢
  • 2016-07-19
  • 2018-07-21
  • 2015-08-18
  • 2020-11-28
  • 2014-11-17
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多