2015-06-03 4 views
1

Итак, я пытаюсь создать класс шаблонов для учебного проекта по теории и логике групп. У меня есть класс:Перегрузка операторов классов шаблонов C++

#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}, который является новым объектом. Однако я не могу расшифровать, как выделить память для нового объекта и вернуть его. Функция я в настоящее время меняется «это» вместо возврата нового объекта:

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; 
} 
+3

Вы делаете это неправильно: Ваши операторы бинарные операторы, которые должны возвращать a 'CSet '. Мутирующие бинарные операторы: @ =, которые должны возвращать 'CSet &'. –

ответ

1

Вы не хотите, чтобы вернуть постоянную ссылку на объект, который вы создаете в функции. Что вам нужно сделать, так это создать объект в функции, а затем вернуть его по значению. Чтобы сделать это, ваш код будет:

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; 
} 
+0

Вы пропустите логику объединения, но идея здесь. BTW, оператор может быть 'const' – Jarod42

+0

Могу ли я использовать константу или нет для возвращаемого значения? и нам не разрешено использовать std :: vector. –

+0

@adam, если вы возвращаетесь по значению, нет никакой причины сделать константу return. Вы можете сделать мысль постоянной. – NathanOliver

Смежные вопросы