【发布时间】:2020-04-01 12:51:23
【问题描述】:
我正在尝试用 C++ 编写一个包含二维数组成员变量的类。这个类的重点是使用这个数组来表示一个模拟的物理模型,我打算把我想在数组上执行的各种动作写成成员函数。
我的问题是尝试在不进行硬编码的情况下初始化类中的数组-理想情况下,我想编写整个程序,以便用户可以在运行时输入数组的维度,这可以然后在类的重载构造函数中使用。即这样的事情:
class Lattice{
public:
//Overload constructor
Lattice(int);
private:
//variables:
int DimensionSize;
int lattice[DimensionSize][DimensionSize];
}
Lattice::Lattice(int N){
DimensionSize = N;
lattice = new int[DimensionSize][DimensionSize];
}
我可以看到上面的代码显然不起作用,因为变量“DimensionSize”在运行时未指定,这意味着二维数组“lattice”所需的内存量是未知的。
我一直在这个论坛上寻找答案,但似乎没有任何对我的问题有直接帮助的东西,而且已经提出的任何其他问题似乎都很老了。如果有人能指出我的解决方案,或者让我知道我想要的是否可能,我将不胜感激 - 我想知道使用向量而不是数组是否可能是一个解决方案?
更新:
我能够通过使用模板类产生我想要的行为:
template <int N>
class Lattice
{
public:
//Constructor
Lattice();
~ some other functions ~
private:
float lattice[N][N];
};
template <int N>
Lattice<N>::Lattice() {
double rando;
// Initialise the array to a random state.
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++){
rando = (double)rand() / ((double)RAND_MAX + 1);
if( rando <= 0.5 ){
lattice[i][j] = -1.0;
}
else if( rando >= 0.5 ){
lattice[i][j] = 1.0;
}
}
}
}
我可以看到使用向量而不是数组是可能的,所以我现在的问题是使用上述模板是否有任何主要缺点?我可以看到类声明和定义现在必须包含在同一个头文件中,如该线程Why can templates only be implemented in the header file? 中所述,但除了这种不便之外,是否还有其他问题?
【问题讨论】:
-
如果您需要使用动态分配,那么
int lattice[DimensionSize][DimensionSize];必须是int** lattice;- 尽管使用像std::vector<std::vector<int>> lattice;这样的适当容器会更好 -
std::vector是这项工作的工具,尽管不要使用 2d 工具。有关如何使用单个向量假装具有多维向量的信息,请参阅此:stackoverflow.com/questions/43358369/… -
是的。数组的大小应在编译时确定。你需要的正是
std::vector -
对于模板,
size_t比int更合适。
标签: c++ arrays class templates vector