std::array
не кажется здесь решением, поскольку get_vertices
- это чисто виртуальная функция, это означает, что вы захотите получить к ней доступ, используя указатель (или ссылку) типа базового класса.И если вы используете std::array
, вы должны предоставить интегральное значение в качестве второго аргумента для std::array
шаблона класса, что возможно, если вы сделаете face
шаблоном класса, что-то вроде этого:
template<size_t N>
class face {
virtual std::array<ptr, N>& get_vertices(void) const = 0;
};
class triangle : public face<3>{
//...
std::array<ptr, 3>& get_vertices(void) const { return vertices; };
};
class quadrilateral : public face<4> {
//...
std::array<ptr, 4>& get_vertices(void) const { return vertices; };
};
Но это приводит к тому, что triangle
и quadrilateral
имеют разные базовые классы: face<3>
и face<4>
- это два разных класса.Это означает, что вы не можете смешивать triangle
и quadrilateral
вместе, скажем, в стандартном контейнере, и вы не можете получить доступ к get_vertices
, используя указатели одного и того же типа базового класса, поскольку в настоящее время нет единого базового класса.Каждый производный класс имеет свой собственный базовый класс.
Итак, решение таково:
class triangle : public face {
private:
std::vector<ptr> vertices;
public:
triangle()
{
//it ensures that you've a vector of size 3, no more no less
vertices.reserve(3);
}
std::vector<ptr>& get_vertices(void) const { return vertices; };
};
Аналогично, вы можете сделать это в quadrilateral
:
quadrilateral()
{
//it ensures that you've a vector of size 4, no more no less
vertices.reserve(4);
}
Сейчасваш вектор не может произвольно изменить свой размер до большего размера, чем он действительно нужен, потому что вы определяете емкость, вызывая reserve()
, и вы добавляете больше элементов, чем его емкость.Изменение размера не происходит.