代码太长了,所以我加入了pastebin,我在这里只提出了最有意义的部分。 (here is the entire code)
我已经创建了一个类List,只要我不尝试创建列表列表就可以正常工作,我举个例子:
List<List<string> > l;
l.push_back(List<string>());
l[0].push_back(string("ciao"));
没有语法错误,但有一个例外,我知道原因,问题是构造函数,它调用赋值运算符:
template <class T>
List<T>::List(const T& info)
{
end=false;
next=prev=this;
this->info=info; // ++++++++++++++
}
问题出现在我使用'+'签名的行中。赋值运算符仅在我将列表分配给列表时才起作用(这意味着它们都必须是哨兵,或者两者都不是哨兵)。所以是分配运算符重载:
template<class T>
List<T>& List<T>::operator= (const List<T>& l) throw()
{
List<T>* ptr=l.next;
try
{
if( (end)^(l.end) )
throw excp1();
}
catch(excp1& e)
{
std::cerr <<"Exception: "<< e.what() <<std::endl;
exit(EXIT);
}
if(this!=&l)
{
if(end)
{
resize(0);
while(!ptr->end)
{
push_back(ptr->info);
ptr=ptr->next;
}
}
else
{
info=l.info;
}
}
return *this;
}
当我尝试将列表节点分配给哨兵或反之时,会发生excp1。他们必须是两个哨兵或两个节点。但我不知道如何避免这种异常,我是否必须编写另一个版本的构造函数?如果有,怎么样?的思想,提出?