C++ 错误c2259“类”:无法实例化抽象类
我对抽象类有这个问题,我在互联网上到处都查到了,包括这里,我问了朋友们,我仍然没有得到答案 我有一个名为“RulePrvoider”的类,还有三个从“Rule Provider”继承的类“GlobalRuleProvider”、“UserRuleProvider”和“OrgRuleProvider”。我还有一个叫做“PacketFilter”的类,这就是我遇到问题的类 我发现如果我把“push_back”放在注释中,程序会编译,但我似乎不知道为什么 这是PacketFilter。h:C++ 错误c2259“类”:无法实例化抽象类,c++,class,vector,constructor,abstract,C++,Class,Vector,Constructor,Abstract,我对抽象类有这个问题,我在互联网上到处都查到了,包括这里,我问了朋友们,我仍然没有得到答案 我有一个名为“RulePrvoider”的类,还有三个从“Rule Provider”继承的类“GlobalRuleProvider”、“UserRuleProvider”和“OrgRuleProvider”。我还有一个叫做“PacketFilter”的类,这就是我遇到问题的类 我发现如果我把“push_back”放在注释中,程序会编译,但我似乎不知道为什么 这是PacketFilter。h: #ifnd
#ifndef _PACKETFILTER_H
#define _PACKETFILTER_H
#include <vector>
#include <set>
#include "OrgRuleProvider.h"
#include "GlobalRuleProvider.h"
#include "UserRuleProvider.h"
class PacketFilter
{
private:
std::vector <RuleProvider>providers;
string globalProvider;
std::set <Rule>rules;
void update();
public:
PacketFilter(string globalProviderPath, string* orgProviderPath, string* userProviderPath);
bool filter(string srcIP, string srcPort, string dstIP, string dstPort, string protocol);
};
#endif
这是packetFilter构造函数,这就是我遇到的问题:
#include "PacketFilter.h"
PacketFilter::PacketFilter(string globalProviderPath, string* orgProviderPath, string* userProviderPath)
{
int i;
RuleProvider* rProv;
try{
rProv = new GlobalRuleProvider(globalProviderPath);
}
catch (int e){
std::cout << "exception number " << e << std::endl;
}
providers.push_back(*rProv);
for (i = 0; i <orgProviderPath->size(); i++)
{
rProv = new OrgRuleProvider(orgProviderPath[i]);
providers.push_back(*rProv);
}
for (i = 0; i < userProviderPath->size(); i++)
{
rProv = new UserRuleProvider(userProviderPath[i]);
providers.push_back(*rProv);
}
}
如果有人发现这个问题,我会非常高兴和感激
提前谢谢 你做不到
std::vector <RuleProvider> providers;
指针与抽象类型不同,因为实际对象本身是RuleProvider的子类,而不是抽象基类
当你把_推回到向量上时,推你用new做的指针;不要用*取消引用它们
当您使用完向量后,您需要记住删除所有指针。这是因为提供者是一个std::vector。当您推回RuleProvider的一个具体子类的对象时,首先使用一个复制构造函数创建一个新的RuleProvider。但如果RuleProvider是抽象类,则会导致错误。规则是永远不要将子类与std容器一起使用。如果需要,您可以使用std::vector。您正在使用new进行分配,然后将副本推回,从而导致内存泄漏。如果您想要虚拟行为,您应该保留指针而不是对象。
std::vector <RuleProvider*> providers;