C++ 如何编译C++;接口';它只在头文件中

C++ 如何编译C++;接口';它只在头文件中,c++,compilation,makefile,header-files,C++,Compilation,Makefile,Header Files,我有一个类Event和一个子类ServerEvent,但是Event类只是ServerEvent扩展/继承的接口。当我运行make时,没有生成一个Event.o,并且我得到一个它不存在的错误 编译这个接口的正确方法是什么?在makefile中添加什么? 另外,我之所以有一个受保护的构造函数,是因为它不能实例化事件。我不能使用虚拟构造函数-继承的正常方式是什么 编辑:现在包括makefile、ServerEvent.cpp和编译错误 事件h #ifndef EVENT_H #define EVEN

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

编译这个接口的正确方法是什么?在makefile中添加什么? 另外,我之所以有一个受保护的构造函数,是因为它不能实例化事件。我不能使用虚拟构造函数-继承的正常方式是什么

编辑:现在包括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
编译错误

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
ServerEvent.o:在函数“ServerEvent::ServerEvent(std::vector)”中:
ServerEvent.cpp:(.text+0x11):未定义对“Event::Event()”的引用
ServerEvent.o:在函数“ServerEvent::ServerEvent(std::vector)”中:
ServerEvent.cpp:(.text+0xe1):未定义对“Event::Event()”的引用
collect2:ld返回了1个退出状态
make:**[correngine]错误1

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


看这里:

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


请看这里:

无法实例化只有
受保护的
私有的
构造函数的类

当然,如果您编写实现,您可以编译它(EDIT:如果您只有头文件,那么没有编译头文件的事情),您就无法获得
事件的实例,因为它是抽象的,因为它只有
受保护的
私有的
构造函数

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

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


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

一个具有
受保护的
私有
构造函数的类
仅无法实例化

当然,如果您编写实现,您可以编译它(EDIT:如果您只有头文件,那么没有编译头文件的事情),您就无法获得
事件的实例,因为它是抽象的,因为它只有
受保护的
私有的
构造函数

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

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

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

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

  • 无论如何,您都需要在某个地方实现
    类事件
    成员函数。实现在哪里?如果出现错误,请显示makefile。显示您的另一个.cpp文件,该文件位于
    的位置#包括
    ing此文件。为什么你认为应该有一个Event.o或类似的东西?好的,我包括了我的makefile和其他文件。我想我不需要.o,但我不确定如何编译它。无论如何,您需要在某处实现
    类事件
    成员函数。实现在哪里?如果出现错误,请显示makefile。显示您的另一个.cpp文件,该文件位于
    的位置#包括
    ing此文件。为什么你认为应该有一个Event.o或类似的东西?好的,我包括了我的makefile和其他文件。我想我不需要.o,但我不确定如何编译它。这个类应该有一个公共虚拟析构函数或一个受保护的非虚拟析构函数。赫伯·萨特称之为帕特
    
    #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