gpt4 book ai didi

C++模板类运算符重载

转载 作者:行者123 更新时间:2023-11-30 05:42:29 24 4
gpt4 key购买 nike

所以我正在尝试为一个关于群论和逻辑的研究项目构建一个模板类。我有课:

#pragma once
#include <iostream>
#include <assert.h>
using namespace std;
template <class T>
class CSet
{
private:
T* arr;
int size;
protected:

public:
/*Constructors & Destructor*/
CSet(int s = 0, T* a = NULL); //Default constructor
CSet(const CSet<T> & obj_input); //Copy constructor
~CSet() { delete[] arr; } //Destructor

/*Operators Overloading*/
const CSet<T>& operator=(const CSet<T>& obj_input); // = overloading
const CSet<T>& operator+=(const T& val_input); // += overloading
const CSet<T>& operator-=(const T& val_input); // -= overloading

/*Logic Operators Overloading*/
const CSet<T>& operator|(const CSet<T>& obj_input);
const CSet<T>& operator&(const CSet<T>& obj_input);
const CSet<T>& operator-(const CSet<T>& obj_input);
bool operator==(const CSet<T>& obj_input);
bool operator!=(const T& val_input);
bool operator>(const CSet<T>& obj_input);
const CSet<T>& operator^(const CSet<T>& obj_input);

//void DifWrite(const CSet<T>& obj_input); //does - and outputs to file

friend ostream& operator<<(ostream& op, const CSet<T>& input) {
for (int i = 0; i < input.size; i++)
{
op << input.arr[i] << " ";
}
return op;
}
};

我正在尝试制作 |运算符来模拟或逻辑功能。这意味着如果我使 A={1,2,3} 和 B={3,4,5} 那么 A|B={1,2,3,4,5} 这是一个新对象。但是我无法破译如何为新对象分配内存并返回它。我目前拥有的功能是更改“this”而不是返回一个新对象:

template <class T>
const CSet<T>& CSet<T>::operator|(const CSet<T>& obj_input) {
if (!arr)
{
*this = obj_input;
return *this;
}
else if (!obj_input.arr)
{
return *this;
}
else
{
for (int i = 0; i < size; i++)
{
temp += this->arr[i];
}
for (int i = 0; i < obj_input.size; i++)
{
temp += obj_input.arr[i];
}
*this = temp;
}
return *this;
}

最佳答案

您不想返回对您在函数中创建的对象的常量引用。你应该做的是在函数中创建一个对象,然后按值返回它。为此,您的代码将是:

template <class T>
CSet<T> CSet<T>::operator|(const CSet<T>& obj_input) const
{
CSet<T> temp;
temp.size = *this.size + obj_input.size;
temp.arr = new T[temp.size];
int i = 0;
for (; i < *this.size; i++)
temp.arr[i] = *this.arr[i];
for (; i - *this.size < obj_input.size; i++)
temp.arr[i] = *this.arr[i];
return temp;
}

如果您改为使用 std::vector 而不是原始数组,您的函数将变为:

template <class T>
CSet<T> CSet<T>::operator|(const CSet<T>& obj_input) const
{
CSet<T> temp;
temp.arr.insert(temp.arr.end(), *this.arr.begin(), *this.arr.end());
temp.arr.insert(temp.arr.end(), obj_input.arr.begin(), obj_input.arr.end())
return temp;
}

关于C++模板类运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30627358/

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