我有一个类需要存储一个可变大小的数组.理想情况下,此大小将被定义为给予类的构造函数的参数.
我可以定义一个常量然后使用它,如下所示:
#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++,所以让我们使用我们可用的更好的语言工具:)