Я использую libPoco для создания фиктивного сервера для проверки кода клиента.Как называется виртуальная функция
class ServerRunnable: public Poco::Runnable {
public:
ServerRunnable(StreamSocket conn) : conn(conn) {
}
void run(){
string mess("Can you hear me?\n");
try{
this->conn.sendBytes(mess.c_str(), mess.size());
} catch (Poco::Exception& ex){
cerr << ex.displayText() << endl;
return;
}
cerr << "The message has been sent." << endl;
}
void setConn(StreamSocket inConn){
this->conn = inConn;
}
private:
StreamSocket conn;
};
int main(int argc, char **argv){
ServerSocket s;
try{
s.bind(8083, true);
} catch (Exception &ex){
cerr << ex.displayText() << endl;
exit(1);
}
s.listen(124);
Poco::ThreadPool Pool(10, 25, 60, 128);
while(1){
try{
StreamSocket conn = s.acceptConnection();
ServerRunnable serveIt(conn);
Pool.start(serveIt);
} catch (Exception &ex){
cerr << ex.displayText() << endl;
Pool.joinAll();
exit(1);
}
}
return 0;
}
Poco::Runnable
является абстрактным классом, и я уверен, что бег является чисто виртуальной функцией. Pool.start(serveIt)
, похоже, вызывает ServerRunnable
run
. Когда я запускаю его с консоли, я постоянно получаю ошибку pure virtual method called
. Однако, если я нахожусь в gdb, перешагнув код, я буду успешно принимать соединение с клиентом и отправлять им данные. ServerRunnable
run
не является чистой виртуальной функцией, и это то, что нужно назвать.
примеры кода для нарезания резьбы libPoco находятся в http://pocoproject.org/slides/130-Threads.pdf
Я также думаю, что я мог бы называть чисто виртуальный метод в конструкторе, но нет ничего в застройщик, и я просто с помощью destuctor по умолчанию. Есть ли что-то, чтобы прибить место и какую чистую виртуальную функцию вызывается? В gdb? Благодарю.
Я согласен, что, скорее всего, что происходит. Общим обстоятельством, вызывающим чистую виртуальную функцию, является то, что виртуальная функция вызывается либо до завершения конструктора, либо после начала деструктора. –