C ++数组常量长度(初始化)

时间:2009-01-26 06:18:15

标签: c++

我有一个包含数组的类。我希望将此数组设置为常量的长度:

// 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经验。我主要测试这种“常数”现象。

6 个答案:

答案 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);
  }
};