Reputation: 101
Could someone please help me understand my errors. I am new to the concept of classes and not sure what I am missing. Did I not declare Task* _task correctly in my header file? Thank you.
MonReqServer.hh:18: error: ISO C++ forbids declaration of 'Task' with no type
MonReqServer.hh:18: error: expected ';' before '*' token
MonReqServer.cc: In constructor 'Pds::MonReqServer::MonReqServer()':
MonReqServer.cc:11: error: class 'Pds::MonReqServer' does not have any field named '_task'
MonReqServer.cc:13: error: '_task' was not declared in this scope
MonReqServer.cc: At global scope:
MonReqServer.cc:16: error: definition of implicitly-declared 'virtual Pds::MonReqServer::~MonReqServer()'
MonReqServer.cc: In destructor 'virtual Pds::MonReqServer::~MonReqServer()':
MonReqServer.cc:18: error: '_task' was not declared in this scope
MonReqServer.hh is as follows:
#ifndef Pds_MonReqServer_hh
#define Pds_MonReqServer_hh
#include "pds/utility/Appliance.hh"
#include "pds/service/Routine.hh"
namespace Pds {
class MonReqServer : public Appliance, public Routine {
public:
MonReqServer();
public:
Transition* transitions(Transition*);
InDatagram* events (InDatagram*);
void routine();
private:
Task* _task;
};
};
#endif
MonReqServer.cc is as follows:
#include "pdsapp/tools/MonReqServer.hh"
#include "pds/service/Task.hh"
#define mult_address "225.0.0.37"
#define mult_port "1100"
using namespace Pds;
MonReqServer::MonReqServer() :
_task(new Task(TaskObject("monlisten")))
{
_task->call(this);
}
MonReqServer::~MonReqServer()
{
_task->destroy();
}
Transition* MonReqServer::transitions(Transition* tr)
{
printf("MonReqServer transition %s\n",TransitionId::name(tr->id()));
return tr;
}
void MonReqServer::routine()
{
int udp_socket_info;
struct sockaddr_in udp_server;
struct sockaddr addr;
struct ip_mreq mreq;
socklen_t fromlen;
fromlen = sizeof addr;
char incoming_message[100];
udp_socket_info = socket(AF_INET, SOCK_DGRAM, 0);
if (udp_socket_info == -1) {
puts("Could not create socket");
}
memset((char*)&udp_server,0,sizeof(udp_server));
udp_server.sin_family=AF_INET;
udp_server.sin_port = htons( 1100 );
udp_server.sin_addr.s_addr = INADDR_ANY;
if (bind(udp_socket_info,(struct sockaddr *)&udp_server, sizeof(udp_server)) < 0) {
perror("bind error");
exit (1);
}
puts("bind");
//join multicast group
mreq.imr_multiaddr.s_addr=inet_addr(mult_address);
mreq.imr_interface.s_addr=htonl(INADDR_ANY);
if (setsockopt(udp_socket_info, IPPROTO_IP,IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {
perror("setsockopt");
exit (1);
}
if (recvfrom(udp_socket_info, incoming_message , sizeof(incoming_message), 0, &addr, &fromlen) <0) {
perror("recvfrom");
}
puts("Message received");
char tcp_ip[20];
char tcp_port[20];
sscanf( incoming_message, "%s %s", tcp_ip, tcp_port);
}
InDatagram* MonReqServer::events (InDatagram* dg)
{
(dg->seq.service()==TransitionId::L1Accept) {
}
return dg;
}
Upvotes: 0
Views: 1301
Reputation: 311010
It seems that header
#include "pds/service/Task.hh"
that contains the declaration of Task
was included neither explicitly nor implicitly in header MonReqServer.hh
where it is used in the definition of class MonReqServer
class MonReqServer : public Appliance, public Routine {
public:
//...
private:
Task* _task;
^^^^^
};
As the compiler does not know what name Task
denotes it also ignored declaration of variable _task
.
Also the class definition does not contain a destructor declaration. However you defined the destructor in file MonReqServer.cc
MonReqServer::~MonReqServer()
{
_task->destroy();
}
Upvotes: 0
Reputation: 9863
You probably need to change the order of the #include
s in MonReqServer.hh (I assume Task
is defined in Task.hh
). But even then it's a good idea to forward-declare Task
in MonReqServer.hh
, so other source files including MonReqServer.hh
know that Task
is a class. Which is to say, put class Task;
in MonReqServer.hh before Task
is referenced.
About the error regarding the implicitly declare destructor: This is because you have defined the destructor without declaring it. Add ~MonReqServer();
to the header file.
Upvotes: 1