C++ 在C+中,类在类中的作用域是什么+;?
我写了一个类,看起来像C++ 在C+中,类在类中的作用域是什么+;?,c++,scope,C++,Scope,我写了一个类,看起来像 class Mesh { public: vector<Vertex> vs; } 我有一个从文件加载网格的函数: shared_ptr<Mesh> load_mesh(string filename) { //.... vector<Vertex> vs; Vertex v(1, 2, 3); vs.push_back(v); return shared_ptr<
class Mesh {
public:
vector<Vertex> vs;
}
我有一个从文件加载网格的函数:
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));
}
还是有更好/更简单的方法来处理这个问题?我觉得你的基本结构不错。将顶点
复制到向量
中,然后将向量
复制到网格
。load\u mesh()
函数中的本地副本将超出范围,但这是因为您制作了一个正常的副本
冒着被指责过早优化的风险,我想说,除非向量很小,否则所有复制都有点低效。有很多方法可以优化它。使用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();
}
#包括
结构顶点{
常数双x,y,z;
顶点(双x,双y,双z):x(x),y(y),z(z){
};
结构网格{
std::向量vs;
网格(std::vector _-vs):vs(std::move(_-vs)){
Mesh(Mesh&&other)noexcept:vs(std::move(other.vs)){}//move构造函数
};
网格
loadMesh(){
//....
std::向量vs;
与后置(1,2,3);
返回网格{std::move(vs)};
}
int main(){
自动网格=加载网格();
}
我正在使用emplace\u back
而不是push\u back
在向量中构建顶点
,并使用std::move
将向量
移动到网格中
返回一个shared_ptr
就可以了,但我想展示一下,您也可以按值返回Mesh
。编译器应该执行,并且不会有副本()。您的原始版本应该可以push_back
在本地vs
中存储v
的副本;根据您声明Mesh
的方式,构造一个网格应该复制本地vs
及其所有元素。局部变量将超出范围并被销毁,但是Mesh
中的副本是安全的。啊,抱歉,修复了这个问题。谢谢你的回复!似乎您询问的是函数中对象的范围,而不是类中类的范围。是否确实不希望std::vector
?-1不是真正的代码。即使添加了所有缺少的分号,此代码也无法编译。也就是说,忘记new
:返回您想要返回的任何内容,让编译器担心优化问题。添加代价高昂的动态分配和间接寻址不一定是提高性能的最佳方法。您的Mesh ctor未命中&&
@Deduplicator,否。只需额外移动一次,我只需要定义一个构造函数,但仍然可以绑定到右值或左值。是的,如果需要,可以限制为右值。@重复数据消除程序Mesh
确实需要一个副本,它需要在其成员变量中使用它。也许这是一个误导性的链接,试试看:我不确定何时或者是否生成了move构造函数。如果有一个显式指定的移动构造函数,我会对代码更有把握。@Cheersandhth.-Alf是的,但是我必须定义一个普通构造函数,实际上还要定义一个复制构造函数。为了简单起见,我可以定义一个普通的构造函数并依赖于emplace\u back
。。。
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;
}
#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();
}