在类中声明数组,并使用构造函数设置其大小 我在一段时间内没有用C++工作,但我刚刚开始用它来做项目。这可能是不可能的,但我正在尝试创建一个模板类,其中包含一个数组,该数组将其大小设置为一个常量的值,我正在尝试使用构造函数设置该常量的值
这是构造函数的代码:在类中声明数组,并使用构造函数设置其大小 我在一段时间内没有用C++工作,但我刚刚开始用它来做项目。这可能是不可能的,但我正在尝试创建一个模板类,其中包含一个数组,该数组将其大小设置为一个常量的值,我正在尝试使用构造函数设置该常量的值,c++,arrays,class,constructor,constants,C++,Arrays,Class,Constructor,Constants,这是构造函数的代码: Tarray(int s): start_size(s){ } #ifndef TARRAY_H_ #define TARRAY_H_ template<int SizeT> class Tarray { private: T this_array[SizeT]; public: Tarray() {} ~Tarray() {} T & operator[](int i){
Tarray(int s): start_size(s){
}
#ifndef TARRAY_H_
#define TARRAY_H_
template<int SizeT>
class Tarray {
private:
T this_array[SizeT];
public:
Tarray() {}
~Tarray() {}
T & operator[](int i){
return this_array[i];
}
};
#endif /* TARRAY_H_ */
这是设置数组大小的代码:
const int start_size;
T this_array[start_size];
这是整个文件:
#ifndef TARRAY_H_
#define TARRAY_H_
template<typename T>
class Tarray {
private:
const int start_size;
T this_array[start_size];
int array_size;
public:
Tarray(int s): start_size(s){
}
~Tarray(){
delete[] this_array;
}
T & operator[](int i){
return this_array[i];
}
};
#endif /* TARRAY_H_ */
\ifndef TARRAY\u H_
#定义TARRAY_H_
模板
类焦油{
私人:
const int start_size;
T这个数组[开始大小];
int数组的大小;
公众:
Tarray(int s):开始大小(s){
}
~Tarray(){
删除[]这个数组;
}
T&operator[](国际一级){
返回此_数组[i];
}
};
#endif/*TARRAY_H_*/
以下是我得到的错误:
..\/template_array/Tarray.h:16:24: error: 'Tarray<T>::start_size' cannot appear in a constant-expression
..\/template_array/Tarray.h:16:34: error: 'new' cannot appear in a constant-expression
..\/template_array/Tarray.h:16:34: error: ISO C++ forbids initialization of member 'this_array' [-fpermissive]
..\/template_array/Tarray.h:16:34: error: making 'this_array' static [-fpermissive]
..\/template_array/Tarray.h: In instantiation of 'Tarray<Person>':
..\Human.cpp:17:24: instantiated from here
..\/template_array/Tarray.h:16:34: error: invalid in-class initialization of static data member of non-integral type 'Person*'
Build error occurred, build is stopped
Time consumed: 343 ms.
。\/template\u array/Tarray.h:16:24:错误:“Tarray::start\u size”不能出现在常量表达式中
..\/template\u array/Tarray.h:16:34:错误:“new”不能出现在常量表达式中
…//TEMPPLAEGARARDATABA/TARRIA.H:16:34:错误:ISO C++禁止成员“TITHY数组”的初始化[fPrime]
..\/template\u array/Tarray.h:16:34:错误:将“this\u array”设为静态[-fppermissive]
..\/template\u array/Tarray.h:在“Tarray”的实例化中:
..\Human.cpp:17:24:从此处实例化
..\/template\u array/Tarray.h:16:34:错误:非整数类型“Person*”的静态数据成员的类内初始化无效
发生生成错误,生成已停止
所用时间:343毫秒。
当我试图调整代码时,错误消息一直在变化,但这些都是来自这个特定构建的错误
感谢您的帮助改用std::vector,让生活变得简单。:) (如果您想要一个固定大小的数组,那么std::array可能是一种可能性,我认为这是在C++11中实现的,如果不是,那么boost可能有一个实现) 但是,如果您坚持使用普通数组语法,就像使用ye olde C一样,那么您将需要使用一个模板参数,这样您的模板类就有两个参数——一个用于它现在已经具有的“T”,另一个用于数组大小
通过自己管理该数组,您的生活变得特别困难——如果您觉得必须定义析构函数,那么除了构造函数之外,还应该定义复制构造函数。(如果我没记错的话,这就是所谓的三大法则),相反,要依靠RAII,避免自己显式调用运算符delete或delete[]来完成这项工作。
std::vector
正是这项工作的工具:
template<typename T>
class Tarray {
private:
std::vector<T> this_array;
public:
Tarray(int s): this_array(s){
}
~Tarray(){
}
T & operator[](int i){
return this_array[i];
}
};
模板
类焦油{
私人:
std::向量这个数组;
公众:
Tarray(int s):这个数组(s){
}
~Tarray(){
}
T&operator[](国际一级){
返回此_数组[i];
}
};
您必须在运行时创建阵列
template<typename T>
class Tarray {
private:
const int start_size;
T* this_array;
int array_size;
Tarray( const Tarrat& inObj ); // no copy
public:
Tarray(int s): start_size(s), this_array( new T[s] ) {
}
~Tarray(){
delete[] this_array;
}
T & operator[](int i){
return this_array[i];
}
};
模板
类焦油{
私人:
const int start_size;
T*这个_数组;
int数组的大小;
Tarray(const Tarrat&inObj);//无副本
公众:
Tarray(int s):开始大小,这个数组(新的T[s]){
}
~Tarray(){
删除[]这个数组;
}
T&operator[](国际一级){
返回此_数组[i];
}
};
注意,要使其工作,T必须有一个默认构造函数(即不带参数的构造函数)。以下代码执行类似操作,但不使用构造函数:
Tarray(int s): start_size(s){
}
#ifndef TARRAY_H_
#define TARRAY_H_
template<int SizeT>
class Tarray {
private:
T this_array[SizeT];
public:
Tarray() {}
~Tarray() {}
T & operator[](int i){
return this_array[i];
}
};
#endif /* TARRAY_H_ */
\ifndef TARRAY\u H\u
#定义TARRAY_H_
模板
类Tarray{
私人:
T这个数组[SizeT];
公众:
Tarray(){}
~Tarray(){}
T&算子[](inti){
返回此_数组[i];
}
};
#endif/*TARRAY_H*/
您可以这样使用它:
TArray<10> myArray;
TArray-myArray;
出现编译器错误的原因如下:
T this_array[start_size];
此行将使您的Tarray
实际包含start\u size
的T
实例。它不会保存指向这些实例的指针或引用——它们将是包含Tarray的其他实例变量的同一内存块的一部分。
这将使类的大小取决于开始大小,而开始大小在编译时是未知的。任何C++类的大小必须在编译时知道,这是不可能的。
有两种方法可以解决此问题:
T
实例的数组。这就是std::vector
所做的。编写这样一个类并使其在被复制/移动/扩展等操作时正常工作既困难又乏味,因此我建议只使用std::vector
此\u数组
未分配new
,因此您不应该删除它。如果数组是类的一部分(而不是由类单独堆分配和拥有),那么默认情况下它将与类的其余部分一起销毁。调用delete
不仅没有必要,而且几乎肯定会导致崩溃。谢谢,但我仍然想知道您是如何做到这一点的。我暂时没有使用C++,我正在尝试重新学习它。如果允许这样的构造, > SeZOOS会如何工作?C++不支持这样的可变长度数组。C99确实是,但不是C++(甚至不是C++ 11)。GNU支持C++中的扩展,但对于自动变量,而不是类成员(据我所知)。您需要显式地使用new
/malloc
,或者使用vector
让该类为您管理动态分配(在几乎所有情况下都是更好的方法)。如果该值仅在运行时已知,则必须使用new动态分配数组。如果该值在编译时已知,那么它可以是一个模板参数,模板参数可以用于数组大小。我认为C99也不支持将其作为结构的一部分,因此这些限制同样适用