Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ Array Member of Constant Length (Initialisation of)

Tags:

c++

I have a class that contains an array. I want this array to be set at the length of a constant:

// Entities.h
    class Entities
    {
        private:
            const int maxLimit;
            int objects[maxLimit];
            int currentUsage;

        public:
            Entities();

            bool addObject(int identifier);
            void showStructure();
    };

The main problem I'm having is with the constructor. I thought:

// Entities.cpp
    Entities::Entities() : maxLimit(50)
    {
        currentUsage = 0;
        cout << "Entities constructed with max of 50" << endl;
    }

would have been sufficient...but not so. I don't know if I can use the initialiser list for array initialisation.

How can I initialise the objects array using the maxLimit const? I'm relatively new to classes in C++ but I have experience with Java. I'm mainly testing out this phenomenon of 'constness'.

like image 601
Rae Avatar asked Jan 26 '09 06:01

Rae


People also ask

What are arrays initialized to in C?

An array may be partially initialized, by providing fewer data items than the size of the array. The remaining array elements will be automatically initialized to zero. If an array is to be completely initialized, the dimension of the array is not required.

Does C initialize arrays to 0?

Initialize Arrays in C/C++ c. The array will be initialized to 0 if we provide the empty initializer list or just specify 0 in the initializer list.

Is initializing an array constant time?

you can initialize an array with a constant value in O(1) time. but it requires extra memory. Actually a better algorithm is known, such that the extra 2n memory words are not needed anymore.

Are arrays in C automatically initialized?

The elements of global and static arrays, on the other hand, are automatically initialized with their default values, which for all fundamental types this means they are filled with zeros.


2 Answers

The array must have a constant length. I mean a length that is the same for all objects of that class. That is because the compiler has to know the size of each object, and it must be the same for all objects of that particular class. So, the following would do it:

class Entities
{
    private:
            static const int maxLimit = 50;
            int objects[maxLimit];
            int currentUsage;

    public:
            Entities();

            bool addObject(int identifier);
            void showStructure();
};

And in the cpp file:

const int Entities::maxLimit;

I prefer to use an enumeration for that, because i won't have to define the static in the cpp file then:

class Entities
{
    private:
            enum { maxLimit = 50 };
            int objects[maxLimit];
            int currentUsage;

    public:
            Entities();

            bool addObject(int identifier);
            void showStructure();
};

If you want to have a per-object size of the array, then you can use a dynamic array. vector is such one:

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;
}

Best is to do as much initialization in the initialization list as possible.

like image 93
Johannes Schaub - litb Avatar answered Sep 22 '22 13:09

Johannes Schaub - litb


You can use template argument if you need to set array size at compile time:

template<size_t maxLimit>
class Entities
{
    int objects[maxLimit];
    public:
        Entities() {}
        ...
};

Entities<1000> inst;
like image 45
Evgeny Lazin Avatar answered Sep 18 '22 13:09

Evgeny Lazin