在类中声明数组,并使用构造函数设置其大小 我在一段时间内没有用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++类的大小必须在编译时知道,这是不可能的。 有两种方法可以解决此问题:

  • 使用array new在堆上分配
    T
    实例的数组。这就是
    std::vector
    所做的。编写这样一个类并使其在被复制/移动/扩展等操作时正常工作既困难又乏味,因此我建议只使用
    std::vector
  • 使T实例的数量固定,并将其作为模板参数传递
  • i、 e:


    此\u数组
    未分配
    new
    ,因此您不应该
    删除它。如果数组是类的一部分(而不是由类单独堆分配和拥有),那么默认情况下它将与类的其余部分一起销毁。调用
    delete
    不仅没有必要,而且几乎肯定会导致崩溃。

    谢谢,但我仍然想知道您是如何做到这一点的。我暂时没有使用C++,我正在尝试重新学习它。如果允许这样的构造, > SeZOOS会如何工作?C++不支持这样的可变长度数组。C99确实是,但不是C++(甚至不是C++ 11)。GNU支持C++中的扩展,但对于自动变量,而不是类成员(据我所知)。您需要显式地使用
    new
    /
    malloc
    ,或者使用
    vector
    让该类为您管理动态分配(在几乎所有情况下都是更好的方法)。如果该值仅在运行时已知,则必须使用new动态分配数组。如果该值在编译时已知,那么它可以是一个模板参数,模板参数可以用于数组大小。我认为C99也不支持将其作为结构的一部分,因此这些限制同样适用