我应该如何在 C++ 中实现一个接受未知数量参数的数组构造函数?
How should I implement an array constructor that takes in an unknown amount of arguments in c++?
我目前正在实现一个动态数组,它使用模板来识别存储的类型。但是,我目前遇到的问题是我不知道如何创建一个构造函数来接受与用户输入的参数一样多的参数来初始化数组。函数重载不会有任何帮助,因为可能没有编写函数来接受用户的参数量,这将是一个非常大的设计问题。
下面是我为此动态数组实现的 class,以帮助了解我要创建的内容。
template <typename T>
class array
{
private:
T *arr;
int size; //Size of current array
int items; //items currently in array
public:
~array();
array();
};
这是一个高度简化的案例(它没有调整大小),但(我希望)解决了您的具体构造问题。如果你这样做是为了练习,你应该从更简单的东西开始,比如堆栈,并阅读异常保证的所有有趣的细微差别(Sutter 对此有一个漂亮的分析)。
#include <iostream>
#include <initializer_list>
#include <algorithm>
template <typename T>
class array
{
size_t size; //Size of current array
int items; //items currently in array
T *arr;
public:
//copy and moving semantic omitted
~array() { delete[] arr; }
//use initializer list available from C++11
array(std::initializer_list<T> init)
: size(init.size()),
items(init.size()),
arr(new T[init.size()])
{
std::copy(init.begin(), init.end(), arr);
}
//create an array with n elements of a specific value
array(size_t count, const T& value)
: size(count), items(count), arr(new T[count])
{
std::fill(arr, arr + count, value);
}
std::ostream& print(std::ostream& os) const
{
for (size_t i = 0; i < size; i++)
os << arr[i] << " ";
return os;
}
};
int main()
{
array<int> a({1,2,3,4,5,6,10});
a.print(std::cout);
array<double> b(5, -1.5);
b.print(std::cout);
}
C++11 支持初始化器列表。
部分文章:
https://www.stroustrup.com/except.pdf 强异常保证向量实现。
https://ptgmedia.pearsoncmg.com/imprint_downloads/informit/aw/meyerscddemo/DEMO/MAGAZINE/SU_FRAME.HTM堆栈异常安全分析(我记得书本版本比本文要扩充)
0/3/5的规则请参考这个linkWhat is The Rule of Three?
https://en.cppreference.com/w/cpp/language/rule_of_three
我们确实必须编写析构函数,因此其他(至少)两个函数到期。
我目前正在实现一个动态数组,它使用模板来识别存储的类型。但是,我目前遇到的问题是我不知道如何创建一个构造函数来接受与用户输入的参数一样多的参数来初始化数组。函数重载不会有任何帮助,因为可能没有编写函数来接受用户的参数量,这将是一个非常大的设计问题。
下面是我为此动态数组实现的 class,以帮助了解我要创建的内容。
template <typename T>
class array
{
private:
T *arr;
int size; //Size of current array
int items; //items currently in array
public:
~array();
array();
};
这是一个高度简化的案例(它没有调整大小),但(我希望)解决了您的具体构造问题。如果你这样做是为了练习,你应该从更简单的东西开始,比如堆栈,并阅读异常保证的所有有趣的细微差别(Sutter 对此有一个漂亮的分析)。
#include <iostream>
#include <initializer_list>
#include <algorithm>
template <typename T>
class array
{
size_t size; //Size of current array
int items; //items currently in array
T *arr;
public:
//copy and moving semantic omitted
~array() { delete[] arr; }
//use initializer list available from C++11
array(std::initializer_list<T> init)
: size(init.size()),
items(init.size()),
arr(new T[init.size()])
{
std::copy(init.begin(), init.end(), arr);
}
//create an array with n elements of a specific value
array(size_t count, const T& value)
: size(count), items(count), arr(new T[count])
{
std::fill(arr, arr + count, value);
}
std::ostream& print(std::ostream& os) const
{
for (size_t i = 0; i < size; i++)
os << arr[i] << " ";
return os;
}
};
int main()
{
array<int> a({1,2,3,4,5,6,10});
a.print(std::cout);
array<double> b(5, -1.5);
b.print(std::cout);
}
C++11 支持初始化器列表。
部分文章:
https://www.stroustrup.com/except.pdf 强异常保证向量实现。
https://ptgmedia.pearsoncmg.com/imprint_downloads/informit/aw/meyerscddemo/DEMO/MAGAZINE/SU_FRAME.HTM堆栈异常安全分析(我记得书本版本比本文要扩充)
0/3/5的规则请参考这个linkWhat is The Rule of Three?
https://en.cppreference.com/w/cpp/language/rule_of_three
我们确实必须编写析构函数,因此其他(至少)两个函数到期。