【问题标题】:error c2259 'class': cannot instantiate abstract class错误 c2259 'class': 无法实例化抽象类
【发布时间】:2015-03-25 01:20:11
【问题描述】:

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

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

我发现如果我将“push_back”放在 cmets 中,程序会编译,但我似乎不知道为什么。

这是 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);
    }
}

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

提前致谢!

【问题讨论】:

  • 您正在使用new 进行分配,然后推回一个副本,导致内存泄漏。如果你想要虚拟行为,你应该保留指针而不是对象。

标签: c++ class vector constructor abstract


【解决方案1】:

你做不到

std::vector <RuleProvider> providers;

RuleProvider 是抽象类。你不能实例化抽象对象。

你需要做的

std::vector <RuleProvider*> providers;

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

当您将push_back 放到向量上时,将您使用new 制作的指针推入;不要使用* 取消引用它们。

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

【讨论】:

    【解决方案2】:

    这是因为providersstd::vector &lt;RuleProvider&gt;。当您push_backRuleProvider 的具体子类的对象时,您首先使用复制构造函数创建一个新的RuleProvider。但是如果RuleProvider是一个抽象类,就会导致错误。规则是您永远不应该将子类与 std 容器一起使用。如果需要,您可以改用std::vector &lt;RuleProvider *&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 2019-03-13
      • 1970-01-01
      相关资源
      最近更新 更多