gpt4 book ai didi

c++ - 虚拟接口(interface)和封装

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:13 25 4
gpt4 key购买 nike

我在虚拟类和封装方面遇到了一些问题。考虑以下 C++ 程序的最小示例:

#include <iostream>

class IConnection
{
public:
virtual void connect() = 0;
virtual std::string recv() = 0;
virtual void disconnect() = 0;
virtual ~IConnection() {}
};


class ConcreteConnection: public IConnection
{
public:
ConcreteConnection(): m_connected(false) {}
void connect() { m_connected = true; }
std::string recv() { return "Received some text."; }
void disconnect() { m_connected = false; }

private:
bool m_connected;

};

class Container
{
public:
Container() { m_connection = NULL; }
void SetConnection(IConnection *connection) { m_connection = connection; };
void GetData() { std::cout << m_connection->recv() << std::endl; }
~Container() { delete m_connection; }

private:
IConnection *m_connection;
};

int main(void)
{
Container container;
ConcreteConnection *connection = new ConcreteConnection();

container.SetConnection(connection);
container.GetData();

return 0;
}

这个简单的示例运行良好,但我对此并不完全满意。这容器对象应该拥有连接,而不会被IConnection 接口(interface)的具体实现。这就是为什么我创建了容器外的 ConcreteConnection 对象。我不喜欢的是我必须传递连接的指针或引用。我想通过连接对象的拷贝,以便主函数没有任何在将连接对象传递给容器。但据我所知,不可能通过拷贝connection,不告诉容器具体实现到哪个它所属的 IConnection。

那么你知道如何解决这个问题吗?是否有可能通过将对象复制到任何函数而不告诉函数到哪个对象所属接口(interface)的具体实现?

我对 C++ 和 OOP 都比较陌生,所以不要犹豫,告诉我,如果我类结构是完全错误的,这种情况在现实生活中不会发生编程代码(以及它应该如何工作)。

提前致谢。

最佳答案

以下是我在现代 C++ 中的写法:

#include <memory>
#include <type_traits>

class Container
{
std::unique_ptr<IConnection> ptr;
explicit Container(IConnection * p) : ptr(p) { }
public:
template <typename T, typename ...Args>
static typename std::enable_if<std::is_base_of<IConnection, T>::value, Container>::type
make(Args &&... args)
{
return Container(new T(std::forward<Args>(args)...));
}
};

用法:

int main()
{
auto c1 = Container::make<ConcreteConnection>();
auto c2 = Container::make<TCPConnection>("127.0.0.1", 8080);
auto c3 = Container::make<LocalPipeConnection>("/tmp/pipe");
}

关于c++ - 虚拟接口(interface)和封装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17115894/

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