gpt4 book ai didi

c++限制核心类可见性并提供干净的界面

转载 作者:行者123 更新时间:2023-11-30 05:17:33 25 4
gpt4 key购买 nike

我有一个具有核心逻辑的 Engine 类,但是这个类有可能被具有类似功能的第三方引擎取代,所以我希望对应用程序的其余部分的影响最小。

我有另一个名为 Adapter 的类,它允许与 Engine 类进行简单的接口(interface),并且还在 Engine 之上提供一些增值功能> 类。

然后我有另一个名为 OrderProcessor 的类,我想将其公开给具有更简单接口(interface)的应用程序的其余部分。

我希望 EngineAdapter 对应用程序的其余部分隐藏,并将 OrderProcesseor 作为应用程序其余部分的唯一接口(interface)。

我该如何设计这个以及在什么地方使用哪个访问修饰符?是否有一种设计模式可以做到这一点?

这就是我所拥有的,但我不认为这是正确的。

//This is the core functionality. Might have to replace this class with a third //party implementation
//Want to hide it as much as possible
class Engine
{
private:
char* ip;
char* port;

protected:
Engine();

bool Connect();
bool DisConnect();
bool SendOrder(Message msg);
bool CancelOrder (CancelMessage cxl);
Message ReceiveOrder();
};


//This is an interface to the engine and provides value added functions
//Don't want this known to anyone except the OrderPRocessor
class Adapter : public Engine
{
private:
int TotalAmount;
double DollarAmount;

protected:
bool Start(char*ip, char* port); //this will call Engine's connect() and do other things
bool Stop (); //this will call Engine's Disconnect
int TotalInventory();
double TotalSales();
double TotalCommission();
};


//This class is the main interface to the rest of the application for order
//processing related functionality.
class OrderProcessor
{
public:
OrderProcessor();
~OrderProcessor();
Stats SendStats();
ManageInventory();

private:
Adapter adapter;
};

最佳答案

使 EngineAdapter 私有(private)嵌套 OrderProcessor 类:

class OrderProcessor 
{
public:
OrderProcessor();
~OrderProcessor();

Stats SendStats();
ManageInventory();

private:
class Engine
{
// ...
};

class Adapter : public Engine
{
// ...
};

Adapter adapter;
};

如果您想要更精细的访问限制,请制作“关键标签”:

class OrderProcessor
{
public:
class OpenSesame
{
friend ClassThatCanAccessTreasure;
private:
OpenSezame() {}; // = default is not sufficient
};

int AccessTreasure(int arg1, int arg2, OpenSesame key = {});
};

请注意,在上面的方案中,您不需要传递key,因为它是默认的。由于默认值是在调用者上下文中实例化的,因此只有 OpenSesame 的 friend 可以调用 AccessTreasure。只要你没有可变参数/参数包,这个默认方案就可以工作;如果你这样做,你需要在那些之前传递它并手动传递它。

关于c++限制核心类可见性并提供干净的界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42075347/

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