Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中,类在类中的作用域是什么+;?_C++_Scope - Fatal编程技术网

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