我的C ++类定义如下:
namespace glDetail
{
class CMesh
{
public:
CMesh(const char* fileName);
/// some more functions...
CMesh& operator=(const CMesh& other) = delete;
CMesh(const CMesh& other) = delete; ///note that assignement operators are disabled !
// That is why I need to use shared_ptrs !
private:
/// some member vars...
};
}
typedef shared_ptr<glDetail::CMesh> Mesh;
shared_ptr CreateMesh(const char* fileName){
make
}
///main.cpp
int main(int argc, char** args){
Mesh mesh = CreateMesh("someFileName");
mesh->Render();
}
有没有办法可以隐藏这个实现,而不是调用CreateXXX调用一个合适的构造函数? (还调用 - &gt;而不是。令人困惑......)像Mesh mesh = Mesh(&#34; someFileName&#34;);
答案 0 :(得分:2)
是的,有办法。不要通过它的记忆管理策略使课堂同步。这是一个非常糟糕的做法。为您的用户提供CMesh课程,让他们用自己想做的事情。类不应该关注它的实例管理方式。
答案 1 :(得分:2)
&#34;问题&#34;是只有->
可以为自定义类型重载,而不是.
。重载->
使智能指针类能够为其拥有的对象的成员函数提供简单的委托,即只需编写mesh->Render()
而不是(*mesh).Render()
的能力。
你唯一可以做的就是获得一些语法糖是&#34;升级&#34;你的typedef
到一个实际的包装类,它封装了shared_ptr
并将所有内容委托给拥有的对象:
class Mesh
{
public:
Mesh(const char* fileName) : ptr(std::make_shared<glDetail::CMesh>(fileName)) {}
void Render() { ptr->Render(); }
private:
std::shared_ptr<glDetail::CMesh> ptr;
};
///main.cpp
int main(int argc, char** args){
Mesh mesh("someFileName");
mesh.Render();
}
同时调用 - &gt;代替 。令人困惑......
不是真的。它是指针的可视指示器。我认为这是一件好事。事实上,作为一名C ++程序员,如果我看到像Mesh
这样的类看起来像一个可以自由创建和复制的值类型,就好像它是一个类似于的 int
或std::string
。您至少应该考虑将其称为MeshWrapper
或MeshHolder
。
类似Mesh mesh = Mesh(&#34; someFileName&#34;);
看起来很像Java。在C ++中,语法更简单(见上文)。像Herb Sutter这样的C ++专家倡导的现代替代方案是:
auto mesh = Mesh { "someFileName" };
事实上,我想知道不使用->
的愿望是否也来自Java背景。如果是这样,您应该习惯C ++指针语法。毕竟,它是一种不同的语言。
答案 2 :(得分:1)
您应该通过合成模式将shared_ptr封装在另一个类中。例如:
class MMesh {
private:
std::shared_ptr<glDetail::CMesh> mesh;
public:
MMesh(const char *fileName) {
mesh = std::shared_ptr<glDetail::CMesh>(new glDetail::CMesh(fileName));
}
glDetail::CMesh * operator -> () const {
return mesh.get();
}
};
///main.cpp
int main(int argc, char** args){
MMesh mesh("someFileName");
mesh->Render();
}
我只写了一个构造函数和运算符->
,我很确定你需要其他构造函数和其他一些方法来正确使用shared_ptr
,但是你忘了说你想怎么做使用它或为什么需要它。