派生 class 的构造函数调用基类 class 的构造函数
Constructor of derived class calling constructor of base class
在下面的代码中,当我尝试创建 Obiektstatyczny
的对象时,正在调用 Miasto
的构造函数(基础 class)。
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
对象,而不是通过基础 class,因此程序一直在重复自己。但是,我不知道如何正确地做到这一点。我的尝试以失败告终。
我试图在 Miasto
class 中创建一个包含 Obiektstatyczny
的字段,然后用 Miasto
的方法初始化它,但我得到了
"unknown override specifier" 错误。
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
并将其留空,则不会立即出现问题。因此,您可能希望将生成非空列表的代码移动到单独的函数 e.h 中。 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
}
在下面的代码中,当我尝试创建 Obiektstatyczny
的对象时,正在调用 Miasto
的构造函数(基础 class)。
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
对象,而不是通过基础 class,因此程序一直在重复自己。但是,我不知道如何正确地做到这一点。我的尝试以失败告终。
我试图在 Miasto
class 中创建一个包含 Obiektstatyczny
的字段,然后用 Miasto
的方法初始化它,但我得到了
"unknown override specifier" 错误。
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
并将其留空,则不会立即出现问题。因此,您可能希望将生成非空列表的代码移动到单独的函数 e.h 中。 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
}