Какова область действия класса внутри класса в 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 и копии не будет ( см. Этот вопрос).

Другие вопросы по тегам