gpt4 book ai didi

c++ - 如何为单个对象创建不同的接口(interface)?

转载 作者:太空狗 更新时间:2023-10-29 20:58:29 24 4
gpt4 key购买 nike

我知道如何创建可应用于不同对象的单一界面。那不是我要找的。我想要相反的行为:我想找到一种机制来为同一对象提供不同的接口(interface),而无需为虚拟调用付费。

本质上,假设我有一个队列,具有 PushMessage、PopMessage 和 IsEmpty 方法:

class Queue
{
public:
void PushMessage(Message message);
Message PopMessage();
bool IsEmpty() const;
}

我想将此队列的句柄交给某人,但只让他们调用 PopMessage 和 IsEmpty,然后将同一个队列的句柄交给其他人,只允许他们调用 PushMessage。因此队列的所有者决定谁可以写入它以及谁可以从中删除消息。

我的一个想法是创建两个类,它们不包含自己的数据成员,但继承自 Queue 并提供代理方法:

struct EnQueueer
: private Queue
{
void PushMessage(Message message){Queue::PushMessage(message);}
}

struct DeQueueer
: private Queue
{
Message PopMessage(){ return Queue::PopMessage();}
bool IsEmpty() const{ return Queue::IsEmpty();}
}

但我不确定这是否安全。原始队列的所有者必须向上转换为 EnQueueer 或 DeQueueer,我不确定这是否完全正确。而且,编译器不喜欢它:

static_cast<DeQueueer*>(&m_queue); // Results in compile error:
// 'Queue' is an inaccessible base of 'DeQueueer'

reinterpret_cast 解决了问题,但我不确定它是否安全。只有派生类没有自己的成员才安全吗?

最佳答案

您始终可以利用隐式转换并拥有一个包装 Queue 的对象。

class EnQueueer {
public:
// implicitly convert to Queue
EnQueueer(const Queue& queue) : m_queue(queue) { }
operator Queue() cont { return m_queue; }
void PushMessage(Message m) { m_queue.PushMessage(m); }
private:
Queue& m_queue;
};

要使其利用不同的实现,请使用模板魔术:

template<typename Q>
class EnQueueer {
public:
// implicitly convert to Queue
EnQueueer(const Q& queue) : m_queue(queue) { }
operator Q() cont { return m_queue; }
void PushMessage(Message m) { m_queue.PushMessage(m); }
private:
Q& m_queue;
};

如果需要,您可以在模板中利用 C++ 概念……但在我看来不是太必要。

请注意,EnQueueer 包含对您的队列的引用,这对于队列的生命周期包含 EnQueueer 的生命周期非常重要。您不能存储 EnQueueer 并让 Queue 消亡。安全使用包括用 EnQueueer 等替换 Queue& 可以正常工作的函数调用和声明,等等。

关于c++ - 如何为单个对象创建不同的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27583286/

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