我希望有一个包含数组的类作为它的数据成员。阵列的大小在构造期间声明。我知道数组的大小需要在编译时知道,但是没有办法通过使用const int
来定义大小并随后使用构造函数初始化列表来解决这个问题吗?我不允许使用矢量。这是我徒劳的尝试:
#include <iostream>
using namespace std;
class myArray {
public:
myArray(int size) : capacity(size) {}
private:
const int capacity;
int a[capacity];
};
int main() {
myArray ar(25);
return 0;
}
它给出以下错误:
'capacity' was not declared in this scope
答案 0 :(得分:2)
尝试使用指针
#include <iostream>
using namespace std;
class myArray {
public:
myArray(int size) : capacity(size) {array = new int[capacity];}
~myArray() {delete [] array;}
private:
const int capacity;
int* array;
};
int main() {
myArray ar(25);
return 0;
}
不要忘记在析构函数中释放。
答案 1 :(得分:1)
它可以使用静态const,但是你会丢失构造函数参数设置。您必须动态分配它才能工作:
class myArray {
public:
myArray(int size) : capacity(size)
{
a = malloc(size * sizeof(int));
}
~myArray() { free(a); }
private:
int capacity;
int* a;
};
int main() {
myArray ar(25);
return 0;
}
尽管使用new []
分配并使用delete []
释放可能比malloc和free更多的是C ++。
如某些评论中所述,如果您动态分配并且不使用shared_ptr
或unique_ptr
等自动资源管理对象,则必须遵循rule of three。< /强>
答案 2 :(得分:1)
原始类的问题在于允许将不同的值作为容量传入。因此,您无法以您希望的方式创建具有该值的数组。没有区别你只是创建一个大小为25的实例,程序的属性,而且这个类本身并不知道它只是用那种方式。
现在我不会质疑为什么你不能使用向量,但是不使用语言/库的全部功能似乎很遗憾。
但是,根据您的限制,您可以动态创建数组,而不是尝试创建固定数组:
#include <iostream>
using namespace std;
class myArray {
public:
myArray(int size) : capacity(size) {
a = new int[capacity];
}
~myArray() {
delete[] a;
}
// Also need all those other things, mandated by the
// rule of 3/5, to allow proper deep copy/move:
// - copy constructor.
// - copy assignment operator.
// - move constructor (C++11).
// - move assignment operator (C++11).
private:
const int capacity;
int *a;
};
int main() {
myArray ar1(25);
myArray ar1(42);
return 0;
}
答案 3 :(得分:1)
以上所有答案都“技术上正确”,但没有一个真正显示智能指针的使用,这使得所有额外的内存管理都不必要。
class my_array
{
public:
my_array (size_t sz)
: arr {new int [sz]} {}
pirvate:
std::unique_ptr <int[]> arr;
};
现在你不必关心(3或5)的规则,代码是正确的,并且(大部分)是异常安全的。
答案 4 :(得分:0)
通过传入capacity
作为变量,您有一个动态大小的数组(其大小仅在运行时已知)。这意味着编译器不知道sizeof(myArray)
,这将导致问题。
相反,您需要存储指向数组的指针。
另一个(丑陋的)方法是使用放置策略,将数组放在struct / class的末尾,并给它一个常量大小为1,如图here所示
答案 5 :(得分:0)
const
不足,因为您甚至可以在执行程序期间获取用户提供的值并将其设为const
:
int x;
std::cin >> x;
const int y = x;
这是不够的,因为在编译程序时必须知道的数组维度。
从历史上看,如果您要初始化static const
&#34;变量&#34;在声明时,这足以说服编译器它可以将该值用于数组维度:
static const unsigned int N = 5;
因为没有办法可以出错。
如今,我们constexpr
的目的是为了明确这一点。