Какова область действия класса внутри класса в C++?
Я написал класс, который выглядит как
class Mesh {
public:
vector<Vertex> vs;
}
где Vertex
является
class Vertex {
public:
const double x, y, z;
}
У меня есть функция, которая загружает Mesh
из файла:
shared_ptr<Mesh> load_mesh(string filename) {
//....
vector<Vertex> vs;
Vertex v(1, 2, 3);
vs.push_back(v);
return shared_ptr<Mesh>(Mesh(vs));
}
Мои вопросы касаются сферы действия Vertex
и vector
,
Один или оба выйдут за рамки?
Какие (если есть) альтернативы являются предпочтительными?
class Mesh1 {
public:
vector<shared_ptr<Vertex>> vs;
}
class Mesh2 {
public:
shared_ptr<vector<Vertex>> vs;
}
class Mesh3 {
public:
shared_ptr<vector<shared_ptr<Vertex>>> vs;
}
Или есть лучший / более простой способ справиться с этим?
1 ответ
Ваша основная структура выглядит прямо для меня. Вы копируете Vertex
в vector
а затем копировать vector
в Mesh
, Местные копии в load_mesh()
функция выйдет из области видимости, но потому что вы сделали копию, это нормально.
На риск быть обвиненным в преждевременной оптимизации, я бы сказал, что если vector
мало всего, что копирование немного неэффективно. Существует несколько способов его оптимизации. С C++11 и семантикой перемещения вы можете сохранить текущую структуру и просто переместить данные:
#include <vector>
struct Vertex {
const double x, y, z;
Vertex(double _x, double _y, double _z) : x(_x), y(_y), z(_z) {}
};
struct Mesh {
std::vector<Vertex> vs;
Mesh(std::vector<Vertex> _vs) : vs(std::move(_vs)) {}
Mesh(Mesh&& other) noexcept : vs(std::move(other.vs)) {} // Move constructor
};
Mesh
loadMesh() {
//....
std::vector<Vertex> vs;
vs.emplace_back(1,2,3);
return Mesh{std::move(vs)};
}
int main() {
auto mesh = loadMesh();
}
я использую emplace_back
вместо push_back
построить Vertex
в vector
на месте и используя std::move
переместить vector
в Mesh
,
Возвращение shared_ptr<Mesh>
было бы хорошо, но я хотел бы показать, что вы также можете вернуть Mesh
по значению. Компилятор должен выполнить RVO и копии не будет ( см. Этот вопрос).