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