错误 c2259 'class': 无法实例化抽象 class
error c2259 'class': cannot instantiate abstract class
我有抽象classes这个问题,我在网上到处查(包括这里https://msdn.microsoft.com/en-us/library/zxt206sk.aspx),我问了朋友,我仍然没有得到答案。
我有一个名为 'RulePrvoider' 的 class,还有三个 class 继承自 'GlobalRuleProvider'、'UserRuleProvider' 和 'OrgRuleProvider' 'Rule Provider'。我还有另一个 class 叫做 'PacketFilter',这就是我遇到问题的 class。
我发现如果我把 'push_back' 放在注释中,程序确实可以编译,但我似乎无法弄清楚为什么。
这是PacketFilter.h:
#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
是摘要class。你不能实例化抽象对象。
你需要做的
std::vector <RuleProvider*> providers;
指针是另一回事——您可以指向抽象类型,因为实际对象本身将是RuleProvider
的子class,不是抽象基础 class.
当你push_back
到向量上时,将你用new
制作的指针推入;不要用 *
.
取消引用它们
完成 vector
后,您需要记住 delete
所有指针。
因为providers
是一个std::vector <RuleProvider>
。当您 push_back
RuleProvider
的具体子 class 的对象时,您首先使用复制构造函数创建一个新的 RuleProvider
。但如果 RuleProvider
是抽象的 class,则会导致错误。规则是永远不要将 subclasses 与 std 容器一起使用。如果需要,您可以改用 std::vector <RuleProvider *>
.
我有抽象classes这个问题,我在网上到处查(包括这里https://msdn.microsoft.com/en-us/library/zxt206sk.aspx),我问了朋友,我仍然没有得到答案。
我有一个名为 'RulePrvoider' 的 class,还有三个 class 继承自 'GlobalRuleProvider'、'UserRuleProvider' 和 'OrgRuleProvider' 'Rule Provider'。我还有另一个 class 叫做 'PacketFilter',这就是我遇到问题的 class。
我发现如果我把 'push_back' 放在注释中,程序确实可以编译,但我似乎无法弄清楚为什么。
这是PacketFilter.h:
#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
是摘要class。你不能实例化抽象对象。
你需要做的
std::vector <RuleProvider*> providers;
指针是另一回事——您可以指向抽象类型,因为实际对象本身将是RuleProvider
的子class,不是抽象基础 class.
当你push_back
到向量上时,将你用new
制作的指针推入;不要用 *
.
完成 vector
后,您需要记住 delete
所有指针。
因为providers
是一个std::vector <RuleProvider>
。当您 push_back
RuleProvider
的具体子 class 的对象时,您首先使用复制构造函数创建一个新的 RuleProvider
。但如果 RuleProvider
是抽象的 class,则会导致错误。规则是永远不要将 subclasses 与 std 容器一起使用。如果需要,您可以改用 std::vector <RuleProvider *>
.