【发布时间】:2021-10-01 13:57:36
【问题描述】:
我有一个简单的球类。它的初始化需要一个颜色名称。
Ball::Ball(ColorName color_name) : m_color_name{color_name} {
}
我尝试创建一个二维矢量板来包含一些球。宽度和高度在外面给出。
class Board {
private:
int m_width;
int m_height;
std::vector<std::vector<Ball>> m_grids;
public:
Board(int width, int height);
~Board();
};
Board::Board(int width, int height) : m_width{width}, m_height{height} {
m_grids.resize(height);
for (int row_num = 0; row_num < height; row_num ++) {
m_grids[row_num].resize(width);
}
}
然后编译器抱怨说球类需要默认构造函数来调整大小。
然后我尝试将其更改为指针。
class Board {
private:
int m_width;
int m_height;
std::vector<std::vector<Ball> *> *m_grids;
public:
Board(int width, int height);
~Board();
};
Board::Board(int width, int height) : m_width{width}, m_height{height} {
m_grids->resize(height);
for (int row_num = 0; row_num < height; row_num ++) {
m_grids->at(row_num)->resize(width);
}
}
或者
Board::Board(int width, int height) : m_width{width}, m_height{height} {
m_grids->resize(height, new std::vector<Ball>[width]);
for (int row_num = 0; row_num < height; row_num ++) {
m_grids->at(row_num)->resize(width);
}
}
他们仍然抱怨同样的事情。
到目前为止,我只能为解决方法创建默认构造函数。
Ball::Ball() {
m_color_name = ColorName::Default;
}
但我真的不喜欢它,因为球不应该是“default_color”。你应该像“黄色”、“粉红色”或我在其他地方定义的某种颜色。
有没有办法避免创建该构造函数?
【问题讨论】:
-
当你调整向量的大小时,它会将新的
Ball对象添加到向量中。除非您明确说明(例如通过默认构造函数),否则它们怎么可能是特定颜色? -
顺便说一句,您将收到
m_grids.resize(height, Ball);的错误,这与默认构造函数的问题无关。第二个参数需要是一个 object,它被复制到所有元素中,而不是类型。 -
std::vector<std::vector<Ball*>> m_grids;是用于参考的球指针的二维向量。如果您不希望默认对象不使用resize,请使用push_back或emplace_back添加您需要的许多单独的自定义项目。 -
另外,在
Board构造函数中,如果有人将负值传递给width和/或height,您还有更多问题。事实上,您不需要width和height成员变量,因为vector通过调用向量的size()函数知道这些信息。无缘无故地携带无关变量只会让您容易发生错误——您现在需要将这些单独的width和height成员同步到向量知道的实际宽度和高度,我已经看到了简单的错误发生试图保持值同步。 -
@Someprogrammerdude 感谢您指出
m_grids.resize(height, Ball);。我在写这个问题时犯了一个错误。
标签: c++ constructor 2d-vector