C++中类内部的类的作用域是什么

What is the scope of a class inside of a class in C++?

本文关键字:作用域 是什么 内部 C++      更新时间:2023-10-16

我写了一个看起来像的类

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;
}

或者有更好/更简单的方法来处理这个问题吗?

您的基本结构对我来说很正确。您将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_backvector中构建Vertex,并使用std::movevector移动到Mesh中。

返回一个shared_ptr<Mesh>是可以的,但我想展示一下您也可以按值返回Mesh。编译器应该执行RVO,并且不会有副本(请参阅此问题)。