繁体   English   中英

将成员函数作为函数变量传递时,无效使用非静态成员函数C ++

[英]invalid use of non-static member function C++ while passing member-function as a function variable

我知道有人问过类似的问题,但我不能指责我的问题。 我有一个具有以下方法的类(用于多线程编程):

  void ServerUtil::WaitForRequst(void (*ProcessRequest)(shared_ptr<TCP> tcp), shared_ptr<struct sockaddr_in> serv_addr){


 TCPPort tcp_port(serv_addr, true);
 struct sockaddr_in client_addr; //FIXME: add these to a vector so their is a way to track clients


 int i = 0;
 while(i < m_thread_max){
     std::shared_ptr<TCP> tcp = std::make_shared<TCP>(serv_addr, &client_addr, tcp_port, true);
     std::shared_ptr<std::thread> t = std::make_shared<std::thread>(std::bind(ProcessRequest, tcp));;
     m_vector_threads.push_back(t);
     i++;
 }


 for(int j = 0; j < m_vector_threads.size();j++)
     m_vector_threads.at(j)->join();
    }

}

现在,我用以下.h文件创建了一个服务器类:

服务器类{公共:

Server(shared_ptr<ServerUtil> serv_util, shared_ptr<struct sockaddr_in> serv_addr);
virtual void ProcessCommand(char &command) = 0;
//ProcessRequest is the primary thread(client) handler
virtual void ProcessRequest(shared_ptr<TCP> tcp) = 0;
bool SendAck(shared_ptr<TCP> tcp);
bool ReceiveAck(shared_ptr<TCP> tcp);
bool CloseConnection(shared_ptr<TCP> tcp);

protected:
shared_ptr<ServerUtil> m_serv_util;
shared_ptr<struct sockaddr_in> m_serv_addr;

};

现在,该问题的以下.cpp文件:

    Server::Server(shared_ptr<ServerUtil> serv_util, shared_ptr<struct sockaddr_in> serv_addr){

    m_serv_util = serv_util;
    m_serv_addr = serv_addr;
    m_serv_util->WaitForRequst(ProcessRequest, serv_addr);
}

我得到以下错误:

 error: invalid use of non-static member function
 m_serv_util->WaitForRequst(ProcessRequest, m_serv_addr);

我还尝试注释掉基类中的构造函数,并在派生类中这样做(覆盖了纯虚函数)。 有任何想法吗?

void ServerUtil::WaitForRequst(void (*ProcessRequest)(shared_ptr<TCP> tcp), 
                               shared_ptr<struct sockaddr_in> serv_addr)

void (*ProcessRequest)(shared_ptr<TCP> tcp)指定将使用指向与给定void (shared_ptr<TCP> tcp)原型相匹配的函数的指针来调用该函数。

void ProcessRequest(shared_ptr<TCP> tcp)

Server的成员,所以它看起来实际上更像

void ProcessRequest(Server * this, shared_ptr<TCP> tcp)

您可以使用以下方法进行清理

void ServerUtil::WaitForRequst(void (Server::*ProcessRequest)(shared_ptr<TCP> tcp), 
                               shared_ptr<struct sockaddr_in> serv_addr)

WaitForRequstWaitForRequst一句:那里有错别字,以后可能会咬人)知道它将得到Server的方法。 但...! 你也将有一个对象实例通过this ,所以

void ServerUtil::WaitForRequst(void (Server::*ProcessRequest)(shared_ptr<TCP> tcp), 
                               Server * instance,
                               shared_ptr<struct sockaddr_in> serv_addr)

这个实例需要用类似的东西传递给线程

std::shared_ptr<std::thread> t = std::make_shared<std::thread>(std::bind(ProcessRequest, 
                                                                    instance, 
                                                                    tcp));

std::thread将为您解决涉及调用方法指针的麻烦问题,但是,如果您有兴趣,这里将进行长时间的讨论,讨论方法指针的试验和麻烦: 成员函数的指针

不幸的是,您正在那里做一些我认为值得另一个问题的事情。 您不需要这些shared_ptr 没有人共享指针,因此std::unique_ptr或完全没有指针应该成为std::unique_ptr 除了instance可能的例外,这里没有任何指针看起来是好的(如果实例的范围不可靠或比线程短,请考虑重新设计)。

那意味着

void ProcessRequest(TCP tcp)

强制性的

void ServerUtil::WaitForRequst(void (Server::*ProcessRequest)(TCP tcp), 
                               Server * instance,
                               shared_ptr<struct sockaddr_in> serv_addr)

 m_vector_threads.emplace_back(ProcessRequest, 
                               instance, 
                               TCP(serv_addr, 
                                   &client_addr, 
                                   tcp_port, 
                                   true));

可能就足够了,这取决于TCP的编写方式。 最好传入所有参数,并让ProcessRequest将TCP实例构造为局部变量。 如果其中存在较小的语法错误,请原谅我。 好像我没有足够的能力来测试所有这些。 不过,如果遇到重大语法错误,请随意打我的屁股。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM