Член массива C++ постоянной длины (Инициализация)

Спецификатор десятичного формата работает только с целочисленными типами :

Поддерживается: только с целыми типами.

blockquote>

Кроме того, он используется для заполнения нулями слева, что не соответствует вашим ожиданиям. Для ваших целей вы можете просто привести к int:

var a = ((int)(((double)x.Row.Points / x.Row.Viewed) * 100)).ToString()

18
задан torrential coding 17 April 2015 в 06:41
поделиться

6 ответов

Массив должен иметь постоянную длину. Я имею в виду длину, которая является тем же для всех объектов того класса. Это вызвано тем, что компилятор должен знать размер каждого объекта, и это должно быть то же для всех объектов того конкретного класса. Так, следующее сделало бы это:

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

Лучший должен сделать как можно больше инициализации в списке инициализации.

32
ответ дан 21 October 2019 в 05:30
поделиться

Можно использовать аргумент шаблона, если необходимо установить размер массива во время компиляции:

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

Entities<1000> inst;
10
ответ дан 21 October 2019 в 05:30
поделиться

для динамичного выделения памяти, Вы, возможно, должны использовать 'новое' ключевое слово как

, объекты были бы определены как:

int * objects;

внутренняя часть конструктор Вы сделали бы:

objects = new int [maxLimit];

редактирование:

забыл упоминать, необходимо будет освободить массив, когда Вы будете сделаны, вероятно, в деструкторе класса.

delete[] objects;
1
ответ дан 21 October 2019 в 05:30
поделиться

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;
}
0
ответ дан 21 October 2019 в 05:30
поделиться

Если все объекты имеют ту же длину, то длина может быть статичной. Это делает это постоянным интегральным выражением позволенный как массив связанный:

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

Помнят, что sizeof (Объекты) является допустимым выражением. Каждый объект Объектов имеет тот же самый размер.

0
ответ дан 21 October 2019 в 05:30
поделиться

Станд. использования:: вектор и Вы получаете ожидаемое поведение. Никакая потребность волноваться об указателях, копиях, и т.д.

#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);
  }
};
0
ответ дан 21 October 2019 в 05:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: