0

我有一个 Event 类和一个子类 ServerEvent,但是 Event 类只是 ServerEvent 扩展/继承的接口。当我运行 make 时,没有生成 Event.o 并且我收到一个错误,指出它不存在。

编译这个接口的正确方法是什么以及在makefile中添加什么?另外,我有一个受保护的构造函数的原因是 Event 不能被实例化。我不能使用虚拟构造函数——继承的正常方法是什么?

编辑:现在包括makefile、ServerEvent.cpp和编译错误

事件.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

服务器事件.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

服务器事件.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
4

3 回答 3

2
  1. 这是一个具体的基类,它有数据成员,所以它不是一个“接口”。“接口”类是指没有数据成员的类,并且所有成员函数在某种意义上都是纯虚拟的。
  2. 您在 .cpp 文件中#include .h 并编译该 .cpp 文件(但我不明白您为什么要这样做,您必须在 ServerEvent .cpp 中#include“Event.h”,对吗?)
  3. 通常,要使接口类可继承但不可实例化是使用纯虚拟 dtor,例如 virtual ~Event() = 0; 但是,由于我的第 0 点,这不适用于您的案例。受保护的 ctor 可能是您的案例的正确方法,但我不得不说它看起来不像一个优雅(或正确)的设计......
于 2013-02-20T05:44:04.250 回答
1

只有一个protectedprivate构造函数的类不能被实例化。

当然,如果您编写实现,则可以编译它(编辑:如果您只有头文件,则没有编译头文件之类的东西),您只是无法获得实例,Event因为它在某种意义上是抽象的只得到protectedprivate构造函数。

要实例化一个实例,请编写一个派生自Event该实例的类,该类具有公共构造函数并且没有任何纯虚函数

(到底为什么你要实例化一个抽象类?如果你需要实例化它,不要将它定义为abstract。)

构造函数不能是虚函数,因为虚函数是根据与类(包括派生类)关联的指针表调用的。调用构造函数时,实例尚未构造,并且不能调用任何虚函数。但是派生类的构造函数会隐式调用其基类的构造函数

于 2013-02-20T05:41:23.653 回答
0

据我所知,您不需要构造函数。你需要一个virtual析构函数,任何你需要实现的方法都需要等于0和virtual。

看这里:如何在 C++ 中声明接口?

于 2013-02-20T05:39:29.073 回答