从析构函数中访问模板 class 构造函数的参数,可以吗?
Access to the template class constructor's parameter from the destructor, is it possible?
我想看看如何从析构函数访问构造函数的参数。在这个例子中我想从构造函数修改参数并在析构函数中恢复它。
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
?
只需将 givenArray
设为 class 的数据成员即可。
然后析构函数(和任何其他成员函数)将可以访问它。
PS:将析构函数中的 size
更改为 originaldata.size()
,如果它们的值将相同(这似乎是您代码中的情况)。否则,您也需要 size
才能成为数据会员。
一般来说,在class中,如果你想从另一个成员函数访问一个成员函数的参数,你需要将该参数存储在class.
总的来说,简化你的代码,它给出:
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;
};
使用更多的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
但是在 constructor/destructor 中做太多事情是危险的。 您不能从析构函数中抛出异常。编辑:请参阅 Peter 的评论。
我想看看如何从析构函数访问构造函数的参数。在这个例子中我想从构造函数修改参数并在析构函数中恢复它。
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
?
只需将 givenArray
设为 class 的数据成员即可。
然后析构函数(和任何其他成员函数)将可以访问它。
PS:将析构函数中的 size
更改为 originaldata.size()
,如果它们的值将相同(这似乎是您代码中的情况)。否则,您也需要 size
才能成为数据会员。
一般来说,在class中,如果你想从另一个成员函数访问一个成员函数的参数,你需要将该参数存储在class.
总的来说,简化你的代码,它给出:
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;
};
使用更多的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
但是在 constructor/destructor 中做太多事情是危险的。 您不能从析构函数中抛出异常。编辑:请参阅 Peter 的评论。