首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++模板类运算符重载

C++模板类运算符重载
EN

Stack Overflow用户
提问于 2015-06-04 01:57:30
回答 1查看 86关注 0票数 1

因此,我正在尝试为一个关于群论和逻辑的学习项目建立一个模板类。我有这样的课程:

代码语言:javascript
复制
#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;
    }
};

我正在尝试让|运算符模拟OR逻辑函数。这意味着如果我让A={1,2,3}和B={3,4,5},然后是A|B={1,2,3,4,5},这是一个新对象。然而,我无法破译如何为新对象分配内存并将其返回。我目前使用的函数是更改'this‘,而不是返回一个新对象:

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2015-06-04 02:07:01

您不希望返回对您在函数中创建的对象的常量引用。您应该做的是在函数中创建一个对象,然后按值返回它。要做到这一点,你的代码应该是:

代码语言:javascript
复制
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而不是原始数组,你的函数将变成:

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30627358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档