gpt4 book ai didi

c++ - 返回不同类型的派生虚函数——指针

转载 作者:行者123 更新时间:2023-11-28 03:31:58 29 4
gpt4 key购买 nike

在我的程序中,我决定用一个名为 Socket 的类来包装“套接字接口(interface)”(实际上只是我正在使用的部分)。我正在使用两个不同的“域”:AF_PACKET 和 AF_INET。因为这些域具有不同的地址结构,所以我决定也包装它们的地址。

我做了一个像下面这样的小类:

class SockAddress
{
public:
SockAddress();

virtual sockaddr* getAddress();
virtual socklen_t getAddrLen();

private:

sockaddr address_;
};

基于这个类,我创建了另一个类,而不是返回一个 sockaddr* 返回一个 sockaddr_ll*`

virtual sockaddr_ll* getAddress();
...
sockaddr_ll address_;

在C语言中,它们都是指针。我只知道到处都需要一个 sockaddr*,如果我传递一个 sockaddr_ll*(并传递相应的 socklen_t 大小值)就会发生没问题。

但是在 C++ 中,当尝试编译时,我得到了一个无效的协变返回类型错误。我已经读过这个错误 here , here , here ,我明白这意味着什么。无论如何,我找不到“解决方法”的方法。

我的问题是:因为我想返回指针(并且指针将具有相同的大小),有没有办法强制编译器接受 sockaddr_ll* 作为 sockaddr *?而且,如果有办法,我该怎么做?

(如果没有办法,解决这个问题的“正确方法”是什么?)

最佳答案

一般来说,如果您的公共(public) API 公开指针并鼓励类型转换,您需要重新设计。

当你在一个类中包装一些东西时,关键是要隐藏细节,而不仅仅是为它们制作一个类似结构的容器。

您正在设计新的类型,您希望将它们当作内置类型。这意味着将所有那些讨厌的指针隐藏在类中。

例如,创建一个仅引用抽象事物的顶级类,如果你想支持不同的低级 API,则创建子类......但将这些 API 完全封装在抽象操作背后的子类中,如 listen/accept/连接。

class Socket
{
public:
Socket(IPAddress address, int port);
virtual ~Socket() = 0; // close/clean up resources
virtual void connect() = 0;
...
};

然后子类化 Socket 类以封装低级 API 的细节。

另一种选择是反转事物,以便 SockAddress 具有隐藏的操作并采用要处理的抽象套接字:

class SockAddress
{
void doSomethingForSocket(Socket *s) { ... }
}

我通常告诉人们首先编写使用 API 的程序,并假设您有一个摇滚明星 API 可以为您做很酷的事情:

Socket s("192.168.5.100", 80);
s.connect();
int i;
i << s;
...
ServerSocket server("*", 80);
Socket *client;
while((client = server.accept()) != null) {
...
}

然后着手制作该 API。在构建 API 本身时使用相同的技术。在编写 connect() 时,可能存在的下一组“好东西”是什么,如果有的话会非常好......然后制作它们。

关于c++ - 返回不同类型的派生虚函数——指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12287338/

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