簡體   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