Почему мой перегруженный оператор приведения не имеет доступа к закрытым членам? - PullRequest
2 голосов
/ 01 апреля 2019

Я пытаюсь реализовать перегруженный оператор приведения в моем шаблонном array2d классе, используя тип T.Поэтому я должен выполнить приведение с array2d<T> к новому array2d<E>.

. Я могу выполнить само приведение, но возникают проблемы, когда я пытаюсь установить приведенные данные на новый экземпляр * 1007.*.Компилятор говорит мне, что оператор приведения не имеет доступа к закрытым членам array2d

Вот где я до сих пор (для краткости отредактировал несвязанный код)

array2d.h

template<typename T>
class array2d {
private:
    // Member Variables
    T** data;
    size_t width, height;
public:
    // constructors, methods, etc...

    // Cast Operator
    template<typename E>
    operator array2d<E>() const;
};

// Other overloaded operators...

// Overloaded Casting Operator
template<typename T>
template<typename E>
array2d<T>::operator array2d<E>() const{
    // Create new instance
    array2d<E> castedArr(width, height);
    // Allocate memory for the casted data, then cast each element
    E** newData = new E*[castedArr.get_height()];

    for (size_t i = 0; i < castedArr.get_height(); i++){
        newData[i] = new E[castedArr.get_width()];
        for (size_t j = 0; j < castedArr.get_width(); j++){
            newData[i][j] = (E)data[i][j];
        }
    }
    // issue here, can't set data because it's private.
    castedArr.data = newData;

    delete [] newData;
    newData = nullptr;

    return castedArr;
}

main.cpp

#include "array2d.h"

int main(int argc, char *argv[]) {
// Cast Operator
    // Create an array2d<T> of
    // width = 5
    // height = 5
    // fill all elements with 42.1
    array2d<double> x(5, 5, 42.1);

    // Create a new array exactly the same as
    // x, where x is casted to int
    array2d<int> y = (array2d<int>) x;

    return 0;
}

Это смутило меня, так как у меня есть много других перегруженных операторов, которые могут получить доступ только к закрытым членамнормально, используя практически ту же логику.

Почему это происходит и что я могу сделать, чтобы исправить это?

1 Ответ

2 голосов
/ 01 апреля 2019

При написании шаблона вы не фиксируете фактический тип, вы создаете синий шрифт для разных типов.array2d<double> и array2d<int> - это разные типы, и по умолчанию два экземпляра двух разных классов не могут получить доступ к своим закрытым членам.

Это можно исправить, объявив каждый экземпляр array2d класса другашаблона array2d:

template<typename T>
class array2d {
    /* ... */

    template<class E> friend class array2d;

    /* ... */
};

В качестве примечания, я не совсем уверен, является ли

delete [] newData;

хорошей идеей.Вы уничтожаете части ресурсов, которыми должен управлять новый экземпляр array2d.Если вы delete[] это снова в array2d::~array2d(), у вас будет неопределенное поведение.

...