Доступ к параметру конструктора класса шаблона из деструктора, это возможно? - PullRequest
0 голосов
/ 29 июня 2018

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

template<typename T>
class sorted_array_view {
public:    
    sorted_array_view(T* givenArray,size_t size) {
         for( int idx = 0; idx < size; ++idx){
            data.push_back(givenArray[idx]);
            originaldata.push_back(givenArray[idx]);
         }
         std::sort(data.begin(), data.end());
         for(int idx =0; idx<size; ++idx){
            givenArray[idx] = data.at(idx);
         }
    }

    ~sorted_array_view(){
         for(int idx =0; idx<size; ++idx){
            givenArray[idx] = originaldata.at(idx);
         }
    }

private:
    std::vector<T> data;
    std::vector<T> originaldata;
};

Но я получил ошибку 'givenArray' was not declared in this scope в деструкторе. Как я могу получить доступ к givenArray?

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

В общем, в классе, если вы хотите получить доступ к аргументу функции-члена из другой функции-члена, вам нужно сохранить этот аргумент в классе.

В целом, упрощая ваш код, он дает:

template<typename T>
struct sorted_array_view
{    
    sorted_array_view(T* array, std::size_t size)
        : original_content{array, array+size}, original_container{array}
    {
        std::sort(array, array+size);
    }

    ~sorted_array_view()
    {
        std::copy(begin(original_content), end(original_content), original_container);
    }

private:
    std::vector<T> original_content;
    T*             original_container;
};

Полная демонстрация: http://coliru.stacked -crooked.com / a / 2958a997404bfaf9

0 голосов
/ 29 июня 2018

Используя больше STL, ваш код может даже стать

#include <iostream>
#include <vector>
#include <algorithm>
template<typename T>
class sorted_array_view {
public:
    sorted_array_view(T* const givenArray, size_t size)
        : data(givenArray, givenArray + size)
        , originaldata(givenArray, givenArray + size)
        , givenArray(givenArray)
    {
        std::sort(data.begin(), data.end());
        std::copy(std::cbegin(data), std::cend(data), givenArray);
    }

    ~sorted_array_view() {
        std::copy(std::cbegin(originaldata), std::cend(originaldata), givenArray);
    }

private:
    std::vector<T> data;
    std::vector<T> const originaldata;
    T* const givenArray;
};

#include <array>
#include <iostream>
int main()
{
    std::array<int, 5> givenArray = { 4, 3, 5, 1, 2 };

    {
        sorted_array_view<int> sortTemp(&givenArray[0], givenArray.size());

        for (const auto& el : givenArray) std::cout << el << " "; std::cout << "\n";
    }
    for (const auto& el : givenArray) std::cout << el << " "; std::cout << "\n";
}

Выход:

1 2 3 4 5 
4 3 5 1 2 

живой пример

Но опасно делать слишком много в вашем конструкторе / деструкторе. Вы не можете выбросить исключение из деструктора. edit: см. Комментарий Peter.

0 голосов
/ 29 июня 2018

Просто сделайте givenArray членом данных класса.

Тогда деструктор (и любая другая функция-член) получит к нему доступ.


PS: Измените size в деструкторе на originaldata.size(), если их значение будет таким же (что, кажется, имеет место в вашем коде). В противном случае вам также потребуется size, чтобы стать членом данных.

...