gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:39:55 25 4
gpt4 key购买 nike

我有一个类包含 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com