在类中定义数组,但大小在构造函数中确定
Defining an array in a class but the size is determined in the constructor
如何将数组定义为类的成员,而它的大小在其他地方确定,实际上它被传递给构造函数。
更多详细信息:有一个整数数组,并且被定义为类中的公共成员。
class foo {
public:
int *arr[];
int s;
};
但是,数组的大小是在构造函数中传递的。
foo::foo()
: s (array_size)
{
}
做这种事的正确语法是什么?
正确的方法是将STL和std::vector< int >
用于此类任务。以下是一个可能对您有用的粗略概述:
#include <vector>
...
class foo
{
public:
std::vector< int > arr_;
...
foo(const int* numbers, int numberCount)
: arr_(numbers, numbers+numberCount)
{
}
...
int size() const
{
return arr_.size();
}
...
int& operator [] (int index)
{
return arr_.at(index);
}
};
关于矢量的更多信息可以在这里找到。进一步建议:
- 如果没有令人信服的理由,不要公开实例变量
- 以某种特殊的方式命名实例变量(例如,通过附加
_
) - 许多人不喜欢全小写的类
您的类似乎试图定义一个"指向int
的指针"数组,而不是您建议的int
数组。然而,经典的答案恰恰是使用"指向int
的指针",在构造函数中分配数组,然后在析构函数中释放它。第一个近似值:
class foo
{
public:
int *arr;
int s;
foo(int sz) : s(sz) { arr = new int [s]; }
~foo() { delete [] arr; }
};
如果你要走这条路,你还需要提供一个赋值运算符和一个复制构造函数(正如Mike Seymour提醒我的那样——谢谢,Mike);如果你不为自己编写,编译器将为你编写的默认版本将是错误的——非常错误。(SO的问题"三条规则是什么?"涵盖了这一点。)
然而,这(可能)不是异常安全的,建议您使用std::vector<int>
而不是普通指针:
class foo
{
public:
std::vector<int> arr;
foo(int sz) : arr(sz) { }
};
您不需要显式存储大小;向量会为你做这件事。
也许这不是你想要的,但我会使用模板参数
template<int T>
class Foo
{
public:
int array[T];
int s;
};
你像一样实例化这个类
Foo<1024> * f = new Foo<1024> ();
首先,我不确定为什么要使用int指针数组,但我是谁来质疑你的设计。。任何人都可以通过指针和动态分配来实现这一点。将您的数组声明为…
int **arr;
并在ctor中将其初始化为..
*arr = new int*[s];
记得用delete[]
在dtor上清理它。另一种选择是使用std::vector<int*>
class foo {
public:
std::vector m_vec;
foo(uint32_t size) : m_vec(size) { }
};
相关文章:
- 具有enable_if外部类原型的模板类构造函数定义
- 构造函数定义中类声明中的模板值
- C++中的继承和构造函数定义
- 如何使用模板化构造函数定义演绎指南?
- 构造函数定义C
- 不正确的成员构造函数定义
- 具有虚拟多重继承的构造函数定义
- C++谷歌测试在哪里放置测试夹具构造函数定义
- 模板类定义中的模板构造函数定义
- C++下面给出的代码中的构造函数定义差异
- 带继承的构造函数定义
- 无法访问构造函数定义之外的变量
- 调用构造函数定义中的函数后收到Segmentation Fault 11错误
- 将具有默认值的构造函数定义为组合对象的私有字段
- 防止重新定义构造函数定义的方法
- 继承构造函数-定义可移植的固定大小类型(C++)
- 在类的私有部分为复制构造函数定义原型如何防止类的复制
- 如何指定继承类的构造函数定义
- 了解默认移动构造函数定义
- 理解构造函数定义块的语法变化