错误c2259' class':无法实例化抽象类

时间:2015-01-26 15:34:10

标签: c++ class vector constructor abstract

我对抽象类有这个问题,我在互联网上到处查看(包括https://msdn.microsoft.com/en-us/library/zxt206sk.aspx),我问过朋友,我仍然没有得到答案。

我有一个名为'RulePrvoider'的类,以及三个继承自'Rule Provider'的类'GlobalRuleProvider','UserRuleProvider'和'OrgRuleProvider'。我还有另一个叫做“PacketFilter”的课程,这就是我遇到问题的课程。

我发现如果我把'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);
    }
}

如果有人发现问题,我将非常高兴和感激。

提前致谢!

2 个答案:

答案 0 :(得分:4)

你做不到

std::vector <RuleProvider> providers;

RuleProvider是抽象类。您无法实例化抽象对象。

你需要做

std::vector <RuleProvider*> providers;

指针是一个不同的故事 - 您可以指向抽象类型,因为实际对象本身将是RuleProvider的子类,而不是抽象基类。

当你push_back进入向量时,按下你使用new创建的指针;请勿使用*取消引用它们。

完成vector后,您需要记住delete所有指针。

答案 1 :(得分:0)

这是因为providersstd::vector <RuleProvider>。当push_back RuleProvider的具体子类的对象时,首先使用复制构造函数创建新的RuleProvider。但如果RuleProvider是一个抽象类,则会导致错误。规则是你永远不应该使用带有std容器的子类。如果您需要,可以使用std::vector <RuleProvider *>