我想看看如何从析构函数访问构造函数的参数。在此示例中,我想从构造函数中修改参数,并将其还原到析构函数中。

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

最佳答案

使用更多的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

live example

但是在构造函数/析构函数中做太多事情是危险的。您不能从析构函数中引发异常。编辑:请参阅彼得的评论。

关于c++ - 从析构函数访问模板类构造函数的参数,可以吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51101267/

10-11 22:25
查看更多