如果不为此类提供空构造函数,为什么会出现编译错误?

时间:2020-11-10 11:25:43

标签: c++

我有一个抛出编译错误的Client类:

class Client {
public:
    struct sockaddr_in* sa;
    int roomid;
    Client(struct sockaddr_in* socka, int id=0) : sa(socka), roomid(id) {}
};

错误:

chatserver.cc:37:2: note:   candidate expects 2 arguments, 0 provided
chatserver.cc:33:7: note: candidate: ‘constexpr Client::Client(const Client&)’
   33 | class Client {
      |       ^~~~~~

但是,如果我添加一个空的构造函数Client() {},则可以正常编译。

为什么?

编辑:

我已经精简了代码,因此更具可读性。

基本上,我初始化一个unordered_map,然后在while循环的开始,我遍历该地图以打印其内容。在循环的更下游,我在UDP套接字上侦听并将新的Client添加到映射:

  unordered_map<string, Client> ip_client_map;

  while (true) {
      for (auto const& x : ip_client_map) {
          cout << x.first << '=' << x.second.sa->sin_addr.s_addr << ':' << ntohs(x.second.sa->sin_port) << endl;
      }
      struct sockaddr_in src;
      socklen_t srclen = sizeof(src);
      char buf[1000];
      int rlen = recvfrom(sockfd, buf, sizeof(buf)-1, 0, (struct sockaddr*) &src, &srclen);
      buf[rlen] = 0;

      string srcaddr = string(inet_ntoa(src.sin_addr)) + ":" + to_string(ntohs(src.sin_port));

      struct sockaddr_in* sa = (sockaddr_in*) malloc(sizeof(struct sockaddr_in));
      memcpy(sa, &src, sizeof(struct sockaddr_in));
      Client new_client = Client(sa);
      ip_client_map[srcaddr] = new_client;

  }

旁注:每次我在while循环开始时打印unordered_map的内容时,IP地址和端口号分别为0和0,所以我认为我没有正确地复制sockaddr_in*。 / p>

0 个答案:

没有答案