gpt4 book ai didi

c++ - 创建一种接口(interface) C++

转载 作者:行者123 更新时间:2023-11-30 04:01:58 25 4
gpt4 key购买 nike

我正在编写一个带有管理器的小型 2d 渲染框架,用于输入和资源,如纹理和网格(用于 2d 几何模型,如四边形),它们都包含在一个与它们和 directX 交互的类“引擎”中类(class)。所以每个类都有一些公共(public)方法,如 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 的所有公共(public)方法,包括 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;

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

有更好的方法可以做到这一点吗??或者它只是没用(我不隐藏“框架私有(private)函数”,用户将学会不调用它们)?

在我使用这个方法之前:

class manager
{
public:
//engine functions

userfunction();
}

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

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

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

抱歉英语不好。

最佳答案

您可以使用您的方法,但最好从公共(public)接口(interface)派生私有(private)接口(interface):

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

或者你可以像这样创建一个“引擎”成为 TextureManager 的 friend :

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

关于c++ - 创建一种接口(interface) C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25454936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com