C++编译未知类型的静态数组

dgjrabp2  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(124)

下面是我的代码:

template<typename T, std::size_t N>
    class my_array {
    public:
        const T& at(std::size_t index) const
        {
            if(index>N) throw std::out_of_range("Index is wrong. Try again");
            return data[index];
        }
        
        ...

        my_array()
        {
            T data[N];
        }
        ~my_array()
        {
            delete[] data;
        }

    private:
        T* data;
    };

在my_array()方法中,我想创建一个类型为T的静态数组,但我真的不明白如何创建。例如,这种方式行不通。
我试着用上面写的方法来做,我也试着用typedef,虽然我可能做错了,但没有一种方法有效。
我该怎么做?

gk7wooem

gk7wooem1#

我猜你想做的是在堆栈上创建一个数组,就像std::array一样?如果是这样,你可以这样做:

template<typename T, std::size_t N>
class my_array {
public:
    const T& at(std::size_t index) const
    {
        if (index >= N) throw std::out_of_range("Index is wrong. Try again");
        return data[index];
    }

    my_array() = default;
    ///~my_array() = default;    // dont write this

private:
    T data[N];
};

注意,不应该在数组上调用delete,因为没有用new分配内存。因为这里没有使用new进行内存分配,所以您可以创建一个空的构造函数和析构函数,或者像我一样使用my_array() = default;指定它。
正如一些评论所说,您可能会访问at()方法中的越界元素。使用index >= N代替(数组从0到N-1)。
顺便说一下,你可以从STL中打开文件array,看看它的实现。他们已经定义了像这样的数据_Ty _Elems[_Size];

编辑:

正如这个答案的注解所述,如果类总是空的,你就不应该为它定义析构函数。通过编写类似~my_array() = default;my_array(){}的代码,并且不指定移动构造函数,数据将始终被复制而不是移动。

相关问题