C ++中类的内部范围是什么?

时间:2014-09-20 21:46:09

标签: c++ scope

我写了一个类似

的课程
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));
}

我的问题涉及Vertexvector

的范围

一个或两个是否会超出范围?

哪种(如果有的话)替代品是首选的?

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 个答案:

答案 0 :(得分:1)

你的基本结构对我来说是正确的。您正在将Vertex复制到vector,然后将vector复制到Meshload_mesh()函数中的本地副本将超出范围,但因为您已制作好的副本。

冒着被指责过早优化的风险,我会说除非vector很小,否则复制效率都会有点低。可以通过多种方式对其进行优化。使用C ++ 11和move semantics,您可以保留当前结构,只需移动数据:

#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_backVertex就地构建vector并使用std::move移动vector进入Mesh

返回shared_ptr<Mesh>会很好,但我想告诉您也可以按值返回Mesh。编译器应该执行RVO并且不会有副本(see this question)。