Общее наследование и перегруженный оператор + - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть шаблон класса "ArrayTemp", который создает массив указателей для типа T, и я пытаюсь создать производный шаблон, который будет выполнять числовые операции. У меня возникли проблемы с реализацией оператора +, который будет добавлять элементы каждого массива и возвращать новый массив с суммами.

Мой базовый класс шаблона:

#include <iostream>
using namespace std;

template <class T>
class ArrayTemp
{
private:
    T* arr;
    int arrSize;
    static int DSize;

public:
    ArrayTemp(): arrSize(DSize), arr(new T[DSize]) {}
    ArrayTemp(const ArrayTemp<T>& at): arrSize(at.arrSize), arr(new T[at.arrSize]) 
    {
        for (int i = 0; i < at.arrSize; ++i)
            arr[i] = at.arr[i];
    }
    ~ArrayTemp()
    {
        delete [] arr;
    }

    ArrayTemp<T>& operator = (const ArrayTemp<T>& source)
{
    if (this != &source)
    {
        for (int i = 0; i < arrSize; ++i)
            setElement(source.getElement(i), i);
    }
            return *this;
}

    int getarrSize() { return arrSize; }
    T& getElement(const int index) { return arr[index]; }
    void setElement(const T& x, int index) { arr[index] = x; }
};

Мой производный шаблон:

#pragma once

#include "ArrayTemp.h"

template <class T>
class numbers: public ArrayTemp<T>
{
public:
    numbers(): ArrayTemp<T>()
    {
        for (int i = 0; i < (getarrSize()); ++i)
            setElement(0, i);
    }
    numbers(const numbers<T>& n): ArrayTemp<T>(const ArrayTemp<T>& x) {}
    ~numbers(){}

    numbers<T> operator + (const numbers<T>& n) const 
    {
        numbers<int> arraysum;

        for (int i = 0; i < getarrSize(); ++i)
            arraysum.setElement((n.getElement(i) + getElement(i)), i);

        return arraysum;
    }
};

template <class T> int ArrayTemp<T>::DSize = 5;

Так что я могу сделать что-то вроде этого в main ():

numbers<int> n1;
numbers<int> n2;
numbers<int> n3;

n3 = n1 + n2;

Как перегруженный оператор + должен быть реализован в структуре, аналогичной той, которую я представил выше? Должен ли я попробовать что-то с конструктором копирования, возвращающим объект чисел? Кроме того, я предполагаю, что поскольку в производном шаблоне нет новых членов данных, достаточно определить оператор присваивания, который просто вызывает оператор присваивания ArrayTemp?

Ошибки Я получаю попробовать этот метод:

cannot convert 'this' pointer from 'const numbers<T>' to 'ArrayTemp<T> &'
1>          with
1>          [
1>              T=int
1>          ]
1>          Conversion loses qualifiers
while compiling class template member function 'numbers<T> numbers<T>::operator +(const numbers<T> &) const'
1>          with
1>          [
1>              T=int
1>          ]

1 Ответ

3 голосов
/ 01 февраля 2012

Непосредственный ответ, по-видимому, заключается в том, что вам необходимо объявить константно-корректные версии ваших функций в базовом шаблоне:

int getarrSize() const { return arrSize; }
T & getElement(int index) { return arr[index]; }
T const & getElement(int index) const { return arr[index]; }

Лучшим ответом может быть то, что вы, вероятно, можете сэкономить массу работы, используясуществующий стандартный контейнер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...