隐藏shared_ptr实现

时间:2015-08-23 13:19:29

标签: c++ c++11

我的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;);

3 个答案:

答案 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这样的类看起来像一个可以自由创建和复制的值类型,就好像它是一个类似于 intstd::string。您至少应该考虑将其称为MeshWrapperMeshHolder

  

类似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,但是你忘了说你想怎么做使用它或为什么需要它。