如何编译仅在头文件中的C ++接口

时间:2013-02-20 05:34:49

标签: c++ compilation makefile header-files

我有一个类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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

无法实例化protectedprivate构造函数 的类。

当然你可以编译它如果你编写实现编辑:如果你有头文件只是没有编译 em>一个头文件),你只是无法获得Event的实例,因为它是 abstract ,因为它只有protectedprivate构造函数

要实例化一个实例,请编写一个派生自Event的类,该类具有公共构造函数和无纯虚函数

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

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

答案 2 :(得分:0)

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

请看这里:How do you declare an interface in C++?