c++ - 使用带有对象 vector 的迭代器 C++

标签 c++ object vector erase

我有一个类包含 ofstream文件,我在使用迭代器删除时遇到问题 此类对象 vector 的对象。

这里是错误:

Error 10 error C2249: 'std::basic_ios<_Elem,_Traits>::operator =' : no accessible path to private member declared in virtual base 'std::basic_ios<_Elem,_Traits>' c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream

代码:

static vector<VOIP> calls;
...
for(...)
{
    VOIP v = VOIP(...);
    calls.push_back(v);
}
...
for( int i = 0 ; i < calls.size() ; i++)
{
    if(...)
    {
        vector<VOIP>::iterator it = calls.begin() + i;
        calls.erase(it);//"?"
        break;
    }
}

Face Error C2249 从行“?”引发,任何帮助 这是类

class VOIP
{
public:
    VOIP(string SourceDirectoryPath, string startTime, signalling sig, int callerIp[], int calleeIp[], int callerPort, int calleePort);
    VOIP(const VOIP & voip);
    ~VOIP(void);
    //caller and callee voice vectors 
    vector<u_char> callerVoiceVector;
    vector<u_char> calleeVoiceVector;
    //caller and callee voice files and path
    ofstream callerVoiceFile;
    ofstream calleeVoiceFile;   
    string outFilePath;
    string log;
    ofstream logFile;
    string startTime;
    string endTime;
    string length;
}

复制构造函数中的注释行引发相同的错误,即错误 C2249

VOIP::VOIP(const VOIP & voip)
    /*:calleePort(voip.calleePort), calleeVoiceFile(voip.calleeVoiceFile), calleeVoiceVector(voip.calleeVoiceVector),
     callerPort(voip.callerPort), callerVoiceFile(voip.callerVoiceFile), callerVoiceVector(voip.callerVoiceVector),
     callType(voip.callType), endTime(voip.endTime), length(voip.length), log(voip.log), logFile(voip.logFile),
     outFilePath(voip.outFilePath), startTime(voip.startTime),
     pleaseDial(voip.pleaseDial), DLHmm(voip.DLHmm)//signalings*///TODO
{
    cout<<"inside copy constractor"<<endl;
}

VOIP::~VOIP(void)
{
    callerVoiceVector.clear();
    calleeVoiceVector.clear();
    callerVoiceFile.close();
    calleeVoiceFile.close();
    logFile.close();
    cout<<"inside destractor"<<endl;
}

最佳答案

一般来说,标准库容器要求它们包含的对象可以是可复制构造和可复制分配的。也就是说,它们需要访问复制构造函数(在您的情况下为 VOIP::VOIP(const VOIP&) )和复制赋值运算符(在您的情况下为 VOIP::operator=(const VOIP&) )。如果您的类没有明确提供它们,那么只要您的编译器可以做到,这些函数就会由您的编译器自动生成:也就是说,只要所有类成员也是可复制构造或可复制分配的,而 VOIP 则不是这种情况,因为无法复制 ofstream

然而,VOIP 提供了一个显式复制构造函数,所以没有问题。这就是为什么需要复制构造函数的 vector<VOIP>::push_back() 起作用的原因。不幸的是,它没有提供复制赋值运算符,而且看起来很奇怪,vector<VOIP>::erase() 需要它。原因是,当您从 vector 中删除一个元素时,它之后的所有元素都必须复制到之前的位置以填补空白。这就是错误消息告诉您的内容:ofstream 不可复制,因为它的基类 std::basic_ios<> 不可复制,所以 VOIP 不可复制。

为了解决您的问题,您可以按照您用于复制构造函数的相同想法为 VOIP 提供一个复制赋值运算符。顺便说一下,在 C++ 中有一种叫做三规则的东西:如果一个类有显式析构函数、复制构造函数或复制赋值运算符,它通常需要所有这三个。 VOIP 有前两个,但没有第三个。写了就万事大吉了。

关于c++ - 使用带有对象 vector 的迭代器 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16057709/

相关文章:

c# - 冒泡排序算法的空间复杂度

c++ - 从嵌套模板中删除 const

class - 神秘的 python 错误 'classobj' 对象没有属性 '__getitem__'。为什么我得到这个?

javascript - 基于 "category"属性和 sum "amount"属性减少对象数组

Javascript不能从同一个类调用交叉方法

java - 从 JSON 重建子对象

c++ - Boost MultiArray 复制构造函数

c++ - 为什么 C++ vector 内部元素/数组在按值传递时会被复制

c++ - 在 C++ 中,哪个是最昂贵的,删除最后一个元素或调整 vector 的大小?

c++ - 将 "a set strings"和 "input from QLineEdit"连接成一个 QString