我有一个类Event和一个子类ServerEvent,但是Event类只是ServerEvent扩展/继承的接口。当我运行时,生成一个Event.o并没有生成,我收到一个它不存在的错误。
编译此接口的正确方法是什么,以及在makefile中添加什么? 另外,我有一个受保护的构造函数的原因是事件无法实例化。我无法使用虚拟构造函数 - 继承的正常方法是什么?
编辑:包括makefile,ServerEvent.cpp和编译错误
Event.h
#ifndef EVENT_H
#define EVENT_H
#include <string>
#define EVENT_STOP 0
#define EVENT_START 1
class Event {
private:
protected:
double time;
std::string label;
int type; // EVENT_START OR EVENT_STOP
Event();
public:
};
#endif
ServerEvent.h
#ifndef SERVEREVENT_H
#define SERVEREVENT_H
#include "Event.h"
#include <vector>
class ServerEvent: public Event {
private:
public:
ServerEvent(std::vector<std::string> tokens);
};
#endif
ServerEvent.cpp
#include "Event.h"
#include "ServerEvent.h"
#include <cstdlib>
#include <sstream>
ServerEvent::ServerEvent(std::vector<std::string> tokens) {
std::stringstream stream(tokens[0]);
stream >> time;
}
生成文件
OBJ = correngine.o CSVManager.o CorrelationEngineManager.o ServerEvent.o
CC = g++
CFLAGS = -c -Wall -pedantic
LFLAGS = -Wall -pedantic
EXE = correngine
correngine : $(OBJ)
$(CC) $(LFLAGS) $(OBJ) -o $(EXE)
correngine.o : correngine.cpp correngine.h CSVManager.h
$(CC) $(CFLAGS) correngine.cpp
CSVManager.o : CSVManager.cpp CSVManager.h
$(CC) $(CFLAGS) CSVManager.cpp
CorrelationEngineManager.o : CorrelationEngineManager.cpp CorrelationEngineManager.h Event.o
$(CC) $(CFLAGS) CorrelationEngineManager.cpp
Event.o : Event.h
$(CC) $(CFLAGS) Event.h
ServerEvent.o: ServerEvent.cpp ServerEvent.h Event.h
$(CC) $(CFLAGS) ServerEvent.cpp
clean :
\rm *.o $(EXE)
编译错误
ServerEvent.o: In function `ServerEvent::ServerEvent(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >)':
ServerEvent.cpp:(.text+0x11): undefined reference to `Event::Event()'
ServerEvent.o: In function `ServerEvent::ServerEvent(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >)':
ServerEvent.cpp:(.text+0xe1): undefined reference to `Event::Event()'
collect2: ld returned 1 exit status
make: *** [correngine] Error 1
答案 0 :(得分:2)
答案 1 :(得分:1)
无法实例化protected
或private
构造函数 的类。
当然你可以编译它如果你编写实现(编辑:如果你有头文件只是没有编译 em>一个头文件),你只是无法获得Event
的实例,因为它是 abstract ,因为它只有protected
或private
构造函数
要实例化一个实例,请编写一个派生自Event
的类,该类具有公共构造函数和无纯虚函数。
(为什么你想要实例化一个抽象类?如果你需要实例化它,不要将它定义为 abstract 。)
构造函数不能是虚拟的,因为根据与类关联的指针表(包括派生类)调用虚函数。调用构造函数时, 实例尚未构造,并且不能调用任何虚函数。 但派生类的构造函数将隐式调用其基类的构造函数。
答案 2 :(得分:0)
据我所知,你不需要构造函数。您需要一个虚拟析构函数,您需要实现的任何方法都需要等于0和虚拟。