I keep getting a runtime error when using the following code. As you
can see, both of the derived classes have their own run() method,
however, the base class defines this method as virtual and required
for all subclasses. The problem occurs when start() is called in the
constructor of the derived class. I get a pure virtual method call
runtime exception and the program dies. This is compiling under
gcc3.2 in Linux, however, in windows MingW with gcc3.2 everything is
fine!!! Since I have no compiler directives and the same compiler on
each system, I cannot see what could be the problem.
Is this a difference in the port of gcc? Or is it caused by the
library calling run() from the start() method call? I am using 1.0.9
without modification on Linux, however, I had to comment
HAVE_OLD_IOSTREAM on windows.
I can provide the full source code if necessary
#ifndef SERVER_H
#define SERVER_H
#include "thread.h"
#include <cc++/thread.h>
#include <cc++/socket.h>
#include <list>
#define DEFAULT_WITHDRAW_PORT 1234
#define DEFAULT_DEPOSIT_PORT 5678
using namespace std;
using namespace ost;
class Server:public Thread{
public:
Server(){
cout << "SERVER" << endl;
setCancel(Thread::cancelImmediate);
}
~Server(){
cout << "~SERVER" << endl;
terminate();
delete sock;
delete addr;
}
virtual void run()=0;
static void setHost(char* host){
Server::host=host;
};
static void setPorts(int withdraw,int deposit){
withdraw_port=withdraw;
deposit_port=deposit;
}
static Server* withdraw;
static Server* deposit;
protected:
InetAddress* addr;
static char* host;
static tpport_t withdraw_port;
static tpport_t deposit_port;
TCPSocket* sock;
};
class WithdrawServer:public Server{
public:
WithdrawServer(){
this->port=Server::withdraw_port;
start();
}
void run();
private:
tpport_t port;
};
class DepositServer:public Server{
public:
DepositServer(){
this->port=Server::deposit_port;
start();
}
void run();
private:
tpport_t port;
};
#endif
//////////////////////////////////////////////////////////////////////////////////////////
char* Server::host;
tpport_t Server::withdraw_port;
tpport_t Server::deposit_port;
Server* Server::withdraw;
Server* Server::deposit;
void WithdrawServer::run(){
if(!Server::host)return;
addr=new InetAddress(Server::host);
sock=new TCPSocket(*addr,port);
while(true){
if(sock->isPendingConnection()){
cout << "W Connected" << endl;
new WithdrawThread(*sock);
cout << "Added to list" << endl;
yield();
}
}
}
void DepositServer::run(){
if(!Server::host)return;
addr=new InetAddress(Server::host);
sock=new TCPSocket(*addr,port);
while(true){
if(sock->isPendingConnection()){
cout << "D Connected" << endl;
new DepositThread(*sock);
yield();
}
}
}
_______________________________________________
Bug-commoncpp mailing list
address@hidden
http://mail.gnu.org/mailman/listinfo/bug-commoncpp