如何在C++类中初始化可变大小的数组?

tsc*_*ppi 9 c++ arrays oop

我有一个类需要存储一个可变大小的数组.理想情况下,此大小将被定义为给予类的构造函数的参数.

我可以定义一个常量然后使用它,如下所示:

#include <iostream>
#define ARRSIZE 5

class Classy{
    private:
        int myarray[ARRSIZE];

    public:
        Classy();
        void printarray();
};

Classy::Classy(){
    for(int i = 0; i < ARRSIZE; i++){
        myarray[i] = i * i * 2;
    }
}

void Classy::printarray(){
    for(int i = 0; i < ARRSIZE; i++){
        std::cout << myarray[i] << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我想这样做:

#include <iostream>
class Classy{
    private:
        int arraysize;
        int myarray[arraysize];

    public:
        Classy(int parraysize);
        void printarray();
};

Classy::Classy(int parraysize){
    arraysize = parraysize;
    for(int i = 0; i < arraysize; i++){
        myarray[i] = i * i * 2;
    }
}

void Classy::printarray(){
    for(int i = 0; i < arraysize; i++){
        std::cout << myarray[i] << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器真的不喜欢我的方法,所以我正在寻找另一种做事方式.

我做了一些关于这个主题的谷歌搜索,但我的搜索并没有取得丰硕成果.我发现这种方法使用动态内存分配来实现它.这是我想避免的,所以我正在寻找一种不依赖于它的解决方案.它可能(我开始认为)它是我问题的唯一优雅解决方案(如果是这种情况,问题当然应该作为重复关闭).

Ben*_*igt 10

它需要使用动态分配,因为sizeof (Classy)必须是编译时常量.对象的内部大小无法增长.但动态分配不必像链接所暗示的那样复杂.

你可以这样做:

#include <memory>
class Classy
{
    private:
        int arraysize;
        std::unique_ptr<int[]> myarray;

    public:
        Classy(int parraysize);
        void printarray();
};

Classy::Classy(int parraysize)
    : arraysize{parraysize}
    , myarray{new int[arraysize]}
{
    for(int i = 0; i < arraysize; i++){
        myarray[i] = i * i * 2;
    }
}

#include <iostream>
void Classy::printarray()
{
    for(int i = 0; i < arraysize; i++){
        std::cout << myarray[i] << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

这将允许尺寸在创建时变化,并在此后固定. std::unique_ptr当你的物体死亡时,它将负责自动销毁阵列内容.


小智 6

你想用模板来解决这个问题:

#include <array>

template<std::size_t ArraySize>
class Classy final
{
public:
    static const std::size_t size = ArraySize;

    /* The rest of your public interface here */
private:
    std::array<int, ArraySize> m_array;
};
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用你的类:

int main()
{
    Classy<5> hasArrayOfFiveElements;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您可以选择不使用 std::array,而优先使用 c 样式数组。但是我们正在编写 C++,所以让我们使用我们可用的更好的语言工具:)

  • 这不会让您按照问题要求“将大小传递给构造函数”。 (3认同)