C++中类内部的类的作用域是什么
What is the scope of a class inside of a class in 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;
}
或者有更好/更简单的方法来处理这个问题吗?
您的基本结构对我来说很正确。您将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
在vector
中构建Vertex
,并使用std::move
将vector
移动到Mesh
中。
返回一个shared_ptr<Mesh>
是可以的,但我想展示一下您也可以按值返回Mesh
。编译器应该执行RVO,并且不会有副本(请参阅此问题)。
相关文章:
- "using namespace std;"在C++的作用是什么?
- 是同一作用域的函数部分中的函数调用
- atomic_thread_fence的作用域是什么
- 局部变量的作用域是块或函数
- 函数和类的作用域有什么区别
- 函数作用域是静态变量还是线程本地变量在C++11中的第一个条目中初始化
- 变量声明中结构的作用域解析是什么意思
- C++中没有大括号的for循环的作用域是什么
- 什么是C++中的作用域指针
- 此字符串的作用域是什么?
- C++11 Lambda闭包通过引用涉及一个堆栈变量,该变量离开作用域是允许的,但得到了未定义的行为
- C++中类内部的类的作用域是什么
- 用户定义文字的作用域是什么
- 文字值的作用域是什么,编译器如何为它分配内存
- 在c++模板中::*(作用域op后面的星号)是什么意思?
- 解析STD库作用域的路径是什么?
- 添加到QList中的c++类的作用域是什么?
- 在c++中,没有变量名的构造函数调用的生存期/作用域是什么?
- 在类定义的类名中,作用域解析操作符的作用是什么?
- 函数返回的unique_ptr的作用域是什么