c++ - 我应该如何实现一个在 C++ 中接受未知数量参数的数组构造函数?

标签 c++ function dynamic-arrays

我目前正在实现一个动态数组,它使用模板来标识存储的类型。但是,我当前遇到的问题是,我不知道如何创建一个构造函数,该构造函数接受用户输入的用于初始化数组的参数数量。函数重载不会有任何帮助,因为函数可能没有被编写来接受用户的参数数量,这将是一个非常大的设计问题。

下面是我为此动态数组实现的类,以帮助了解我正在尝试创建的内容。

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强异常保证 vector 实现。

https://ptgmedia.pearsoncmg.com/imprint_downloads/informit/aw/meyerscddemo/DEMO/MAGAZINE/SU_FRAME.HTM堆栈异常安全分析(我记得书版比本文要扩充)

0/3/5 What is The Rule of Three?的规则请引用此链接

https://en.cppreference.com/w/cpp/language/rule_of_three

我们确实必须编写析构函数,因此其他(至少)两个函数也需要编写。

关于c++ - 我应该如何实现一个在 C++ 中接受未知数量参数的数组构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67173410/

相关文章:

c++ - 在没有内存泄漏的情况下将动态分配的数组复制到更大的数组

c++ - 从 n-ary 树中删除动态数组节点时断言错误

c++ - 格式化 printf (c) 等同于 C++ 中的格式化 cerr

c++ - 返回 T<A> 的函数在某些 typedef 情况下无法编译

c++ - 对函数的 decltype 感到沮丧

javascript - javascript 和 if-else 函数的新手。 (控制台日志中没有错误信息)

C++ 更新函数参数

c++ - 无法完全专门化字符串文字的模板

JavaScript 闭包范围

vba - Excel UDF 对表中的数据 block 进行逆透视(熔化、反向透视、展平、标准化)