【发布时间】:2015-01-10 01:55:13
【问题描述】:
所以,我定义了模板类,然后尝试重载一些运算符。
template <typename T> class Set
{
public:
Set(void);
Set(Set&);
~Set(void);
bool contains(T elem);
bool add(T elem);
bool remove(T elem);
bool add(T* tab, int size);
T* getSet();
int size();
Set<T> &operator+(Set<T> &snd);
Set<T> &operator-(Set<T> &snd);
private:
T *elements;
int numOfElem;
};
当我尝试通过 add 方法向 Set 添加元素时,一切正常。
template<typename T>
bool Set<T>::add(T elem)
{
bool found = false;
for(int i =0; !found && i<numOfElem; i++){
if(elem == elements[i]) found = true;
}
if( !found ){
numOfElem++;
T* tmp = new T[numOfElem];
for(int i =0; i<numOfElem-1; i++){
tmp[i] = elements[i];
}
tmp[numOfElem-1] = elem;
delete[] elements;
elements = tmp;
}
return !found;
}
template<typename T>
bool Set<T>::add(T* myArray, int size)
{
bool result = false;
for(int i =0; i<size; i++){
add(myArray[i]);
}
return result;
}
template<typename T>
Set<T>& Set<T>::operator+(Set<T> &snd)
{
Set *temp = new Set(*this);
temp->add(snd.getSet(), snd.size());
return *temp;
}
template<typename T>
void Set<T>::operator=(Set<T> &snd)
{
numOfElem = snd.numOfElem;
elements = new T[numOfElem];
for(int i =0; i < numOfElem; i++){
elements[i] = snd.elements[i];
}
}
template<typename T>
int Set<T>::size()
{
return numOfElem;
}
template<typename T>
T* Set<T>::getSet()
{
return elements;
}
template<typename T>
Set<T>::Set()
{
numOfElem = 0;
elements = nullptr;
}
template<typename T>
Set<T>::Set(Set& old)
{
numOfElem = old.numOfElem;
elements = new T(numOfElem);
for(int i = 0; i< numOfElem; i++){
elements[i] = old.elements[i];
}
}
template<typename T>
Set<T>::~Set()
{
numOfElem = 0;
delete[] elements;
elements = nullptr;
}
但如果我改用 + 运算符(添加两个单独的集合),则会在尝试删除数组(15 行)时发生错误。有什么想法吗?
int main(){
Set <char> set1, set2, set3;
char tab[] = {'a','d','f','g'} ;
set1.add(tab, 4);
char tab2[] = {'a','d','x','y','z'} ;
set2.add(tab2,5);
set3= set1+set2;
}
【问题讨论】:
-
返回对本地对象的引用绝不是明智的。你应该听过编译器的警告(
return temp来自operator+)。把签名改成template<typename T> Set<T> Set<T>::operator+(Set<T> &snd),没人受伤。 -
@PiotrSzymczyk “好的,好点子,但它并没有解决问题。” 好吧,你应该给@987654321 @为您的问题,而不是拒绝建议,并等待其他用户调试您的代码!不幸的是,出于不同的原因,我一直在对您的问题进行近距离投票,但实际上您是在问一个重复的问题:Can a local variable's memory be accessed outside its scope?。我应该把你的问题放在第一位。
-
我猜是双重删除。如果你有一个原始指针,你需要考虑三法则。我只看到两个。 stackoverflow.com/questions/4172722/what-is-the-rule-of-three
-
对不起,这是我在这里的第一篇文章,我已经更新了代码 (MCVE) 以表明问题确实存在。复制赋值运算符也没有帮助。
-
你想在这里使用括号
[]吗?elements = new T(numOfElem);如果您将所有代码放在一个块中以便可以轻松复制/粘贴,并且如果您使用代码格式化按钮,而不是 sn-ps 按钮来格式化代码,这将有助于任何试图实际运行您的代码的人.
标签: c++ templates overloading heap-corruption