C++ 错误C2248:无法访问类中声明的私有成员,编译器行为异常

C++ 错误C2248:无法访问类中声明的私有成员,编译器行为异常,c++,compiler-errors,C++,Compiler Errors,我遇到了一个奇怪的问题。我有以下课程: #pragma once #include <fstream> #include "Rule.h" #include <string> #include <iostream> using namespace std; class RuleProvider { public: RuleProvider(string); bool isValid(); string getError(); b

我遇到了一个奇怪的问题。我有以下课程:

#pragma once
#include <fstream>
#include "Rule.h"
#include <string>
#include <iostream>
using namespace std;
class RuleProvider
{
public:
    RuleProvider(string);
    bool isValid();
    string getError();
    bool isEOF();
    virtual Rule readNext() = 0;
    void set();
protected:
    string _error;
    string _path;
    ifstream _file;
};
其他函数仅使用
ifstream
的内置函数,例如
是开放的
等等。 在主程序中,我初始化了一个对象,该对象通过其构造函数初始化了
RuleProvider
的许多派生类,并将它们(作为多态指针)推送到一个向量中。这是该对象的构造函数中的代码段:

    (this->_providers).push_back(&this->_globalProvider);

for(int i = 0 ; i < orgProviderSize ; i++)
{
    (this->_providers).push_back(new OrgRuleProvider(orgProviderPath[i]));
}

for(int i = 0 ; i < userProviderSize ; i++)
{
    (this->_providers).push_back(new UserRuleProvider(userProviderPath[i]));
}

for(int i = 0 ; i < orgProviderSize + userProviderSize + 1 ; i++)
{
    while(!((this->_providers)[i]->isEOF()))
    {
        this->_rules.insert((this->_providers)[i]->readNext());
    }
}
另外两个类也完全相同,只是使用了另一个名称(以及不同的
readNext()
)-
OrgRuleProvider
UserRuleProvider

class Rule
{
public:
    Rule(string, string, string, string, string);
    string getSrcIP() const;
    string getDstIP() const;
    string getSrcPort() const;
    string getDstPort() const;
    string getProtocol() const;
    bool operator==(const Rule& other) const;
    bool operator<(const Rule& other) const;
    bool operator>(const Rule& other) const;
private:
    static bool isValidIP(string);
    static bool isValidPort(string);
    static bool isValidProtocol(string);
    string _srcIP;
    string _srcPort;
    string _dstIP;
    string _dstPort;
    string _protocol;
};
类规则
{
公众:
规则(字符串,字符串,字符串,字符串,字符串);
字符串getSrcIP()常量;
字符串getDstIP()常量;
字符串getSrcPort()常量;
字符串getDstPort()常量;
字符串getProtocol()常量;
布尔运算符==(常量规则和其他)常量;
布尔运算符(常量规则和其他)常量;
私人:
静态布尔isValidIP(字符串);
静态bool isValidPort(字符串);
静态bool-isValidProtocol(字符串);
字符串_srcIP;
字符串_srcPort;
字符串dstIP;
字符串dstu端口;
字符串协议;
};
这是一个通用对象,其构造函数如下所示:

class PacketFilter
{
public:
    PacketFilter(string, string*, int, string*, int);
    bool filter(string srcIP, string srcPort, string dstIP, string dstPort, string protocol);
    ~PacketFilter(void);
private:
    void update();
    GlobalRuleProvider _globalProvider;
    vector<RuleProvider*> _providers;
    set<Rule> _rules;
};
class PacketFilter
{
公众:
PacketFilter(string,string*,int,string*,int);
bool过滤器(字符串srcIP、字符串srcPort、字符串dstIP、字符串dstPort、字符串协议);
~PacketFilter(无效);
私人:
无效更新();
GlobalRuleProvider\u globalProvider;
向量提供者;
制定规则;
};

问题出在哪里?出于某种原因,我怀疑基本的
规则提供程序
的构造函数。

问题在于这个
ifstream\u文件。流不可复制

你什么意思?我如何解决它?如果是这样的话,我应该使用指向ifstream的指针吗?它是如何复制文件的?你是不是在没有引用的情况下传递它是一个函数?@Joseph:我怎么知道?!我看不到你的代码,你也没有发布一个完整的,最小的测试用例来重现这个问题。我猜您正在某处复制一个
规则提供程序
:尝试这样做也会尝试复制其成员,并且流不能被复制(因为它是一个数据流,而不是一个容器)。如果你阅读了整个错误信息(而不是其中的一小部分),你应该会看到一个方便的行号@约瑟夫:不。仔细地读和写。为了调试您的问题,您应该已经编写了一个!我不明白人们如何在不编写测试用例的情况下调试他们的编程问题,但是我看到人们每天都来这里,没有测试用例。这很奇怪,给我们一个复制错误的最小程序。此代码不够。成员名称不应以下划线开头。这是留给编译器生成器的。@Wimmel你是什么意思?这不是一个惯例吗?我一直在用它。@Wimmel:不,.@Joseph:这是合法的,但不是一个很好的惯例。这就像“匈牙利符号lite”。如果可以,尽量避免它;给你的会员起个好名字。
class GlobalRuleProvider : public RuleProvider
{
public:
    GlobalRuleProvider(string);
    virtual Rule readNext();
    ~GlobalRuleProvider(void);
};
class Rule
{
public:
    Rule(string, string, string, string, string);
    string getSrcIP() const;
    string getDstIP() const;
    string getSrcPort() const;
    string getDstPort() const;
    string getProtocol() const;
    bool operator==(const Rule& other) const;
    bool operator<(const Rule& other) const;
    bool operator>(const Rule& other) const;
private:
    static bool isValidIP(string);
    static bool isValidPort(string);
    static bool isValidProtocol(string);
    string _srcIP;
    string _srcPort;
    string _dstIP;
    string _dstPort;
    string _protocol;
};
class PacketFilter
{
public:
    PacketFilter(string, string*, int, string*, int);
    bool filter(string srcIP, string srcPort, string dstIP, string dstPort, string protocol);
    ~PacketFilter(void);
private:
    void update();
    GlobalRuleProvider _globalProvider;
    vector<RuleProvider*> _providers;
    set<Rule> _rules;
};