创建一种接口c ++

时间:2014-08-22 20:05:37

标签: c++ frameworks interface

我正在编写一个带有管理器的小二维渲染框架,用于输入和资源,如纹理和网格(用于二维几何模型,如四边形),它们都包含在与它们交互并使用directX的类“引擎”中类。所以每个类都有一些公共方法,如init或update。它们由引擎类调用以呈现资源,创建它们,但是用户不应该调用它们中的很多:

//in pseudo c++
//the textures manager class
class TManager
{
  private:
     vector textures;
     ....
  public:
     init();
     update();
     renderTexture();
     //called by the "engine class"

     loadtexture();
     gettexture();
     //called by the user
}


class Engine
{
private:
   Tmanager texManager;

public:
     Init() 
     { 
       //initialize all the managers
     }
     Render(){...}
     Update(){...}

     Tmanager* GetTManager(){return &texManager;} //to get a pointer to the manager 
                                                  //if i want to create or get textures
}

通过这种方式,调用Engine :: GetTmanager的用户可以访问Tmanager的所有公共方法,包括init update和rendertexture,这些方法必须由Engine在其init,render和update函数中调用。 那么,以下列方式实现用户界面是一个好主意吗?

//in pseudo c++
//the textures manager class
class TManager
{
  private:
     vector textures;
     ....
  public:
     init();
     update();
     renderTexture();
     //called by the "engine class"

     friend class Tmanager_UserInterface;
     operator Tmanager_UserInterface*(){return reinterpret_cast<Tmanager_UserInterface*>(this)}
}

class Tmanager_UserInterface : private Tmanager
{
  //delete constructor
  //in this class there will be only methods like:

   loadtexture();
   gettexture();
}

class Engine
{
private:
   Tmanager texManager;

public:
     Init() 
     Render()
     Update()

     Tmanager_UserInterface* GetTManager(){return texManager;}
}

//in main function
   //i need to load a texture
   //i always have access to Engine class 

engine->GetTmanger()->LoadTexture(...) //i can just access load and get texture;

通过这种方式,我可以为每个对象实现多个接口,只保持i(和用户)所需的功能。

还有更好的方法吗?或者它只是无用(我不隐藏“框架私有函数”,用户将学会不要打电话给他们)?

在使用此方法之前:

class manager
{
 public:
   //engine functions

   userfunction();
}

class engine
{ 
 private:
 manager m;
  public:
   init(){//call manager init function}

   manageruserfunciton()
   {
    //call manager::userfunction()
   }
}

通过这种方式我无法访问经理类,但这是一个糟糕的方式,因为如果我添加 对于管理器的一个新功能我需要在引擎类中添加一个新方法,这需要花费很多时间。

抱歉英语不好。

1 个答案:

答案 0 :(得分:2)

您可以使用自己的方法,但最好从公众派生私人界面:

class TexManagerPublic
{
public:
    virtual void load() = 0;
    virtual void save() = 0;
};
class TexManagerPrivate : public TexManagerPublic
{
public:
    void load();
    void save();
    void init();
    void update();
};
class Engine
{
    TexManagerPrivate theTexManager;
public:
    Engine() { theTexManager.init(); }
    TexManagerPublic* texManager() { return &theTexManager; }
};

或者你可以制造一个&#39;引擎&#39;像这样成为TextureManager的朋友:

class TexManager
{
private:
    void init();
    void update();
    friend class Engine;
};
class Engine
{
    TexManager texManager;
    void init()
    {
        texManager.init();
    }
};