我有一个包含数组的类。我希望将此数组设置为常量的长度:
// Entities.h
class Entities
{
private:
const int maxLimit;
int objects[maxLimit];
int currentUsage;
public:
Entities();
bool addObject(int identifier);
void showStructure();
};
我遇到的主要问题是构造函数。我想:
// Entities.cpp
Entities::Entities() : maxLimit(50)
{
currentUsage = 0;
cout << "Entities constructed with max of 50" << endl;
}
本来就足够了......但事实并非如此。我不知道是否可以使用初始化列表进行数组初始化。
如何使用objects
const初始化maxLimit
数组?我对C ++中的类比较新,但我有Java经验。我主要测试这种“常数”现象。
答案 0 :(得分:32)
数组必须具有恒定长度。我的意思是该类的所有对象的长度相同。这是因为编译器必须知道每个对象的大小,并且对于该特定类的所有对象它必须是相同的。所以,以下会这样做:
class Entities
{
private:
static const int maxLimit = 50;
int objects[maxLimit];
int currentUsage;
public:
Entities();
bool addObject(int identifier);
void showStructure();
};
在cpp文件中:
const int Entities::maxLimit;
我更喜欢使用枚举,因为我不必在cpp文件中定义静态:
class Entities
{
private:
enum { maxLimit = 50 };
int objects[maxLimit];
int currentUsage;
public:
Entities();
bool addObject(int identifier);
void showStructure();
};
如果要拥有数组的每个对象大小,则可以使用动态数组。 vector
就是这样的一个:
class Entities
{
private:
const int maxLimit;
std::vector<int> objects;
int currentUsage;
public:
Entities();
bool addObject(int identifier);
void showStructure();
};
// Entities.cpp
Entities::Entities(int limit)
: maxLimit(limit), objects(limit), currentUsage(0)
{
cout << "Entities constructed with max of 50" << endl;
}
最好是在初始化列表中尽可能多地进行初始化。
答案 1 :(得分:10)
如果需要在编译时设置数组大小,可以使用template参数:
template<size_t maxLimit>
class Entities
{
int objects[maxLimit];
public:
Entities() {}
...
};
Entities<1000> inst;
答案 2 :(得分:1)
动态分配您可能需要使用'new'关键字的内存,例如
对象将被定义为:
int * objects;
你可以在构造函数中执行:
objects = new int [maxLimit];
编辑:
忘记提及,你需要在完成后解除分配数组,可能是在类的析构函数中。
delete[] objects;
答案 3 :(得分:0)
const int
。如果您不知道申报时必须具有的价值,那么您将不得不采用不同的策略。
您需要在构造函数中创建数组,同时将指针保持在外部。这是你想要做的吗?
在你班上:
private:
int maxLimit;
int* objects;
外面:
Entities::Entities() : maxLimit(50)
{
currentUsage = 0;
cout << "Entities constructed with max of 50" << endl;
objects = new int[maxLimit];
}
Entities::~Entities()
{
delete [] objects;
}
答案 4 :(得分:0)
如果所有对象具有相同的长度,则长度可以是静态的。这使得它成为一个允许作为数组绑定的常量整数表达式:
class Entities
{
private:
static const int maxLimit = 50;
int objects[maxLimit];
int currentUsage;
//...
};
请记住,sizeof(实体)是一个有效的表达式。每个Entities对象都具有相同的大小。
答案 5 :(得分:0)
使用std :: vector并获得预期的行为。无需担心指针,副本等
#include <vector>
class Entities
{
private:
const int limit;
std::vector<int> objects;
public:
Entities(int a_limit)
: limit(a_limit), objects(a_limit)
{ }
void addObject(int identifier)
{
if (objects.size() == limit)
throw whatever;
objects.push_back(identifier);
}
};