Объявляйте и инициализируйте массив struct / class одновременно - PullRequest
3 голосов
/ 17 июля 2009

1.

Я знаю, что в объявлении можно инициализировать массив структур. Например:

struct BusStruct
{
    string registration_number;
    string route;
};

struct BusStruct BusDepot[] =
{
    { "ED3280",    "70" },
    { "ED3536",    "73" },
    { "FP6583",    "74A" },
};

Если структура преобразована в класс, например:

class BusClass
{
protected:
    string m_registration_number;
    string m_route;
public:
    // maybe some public functions to help initialisation
};

Можно ли сделать то же самое, что и для структуры (т.е. объявить и инициализировать массив классов одновременно)?

2. Правильно ли я считаю, что невозможно объявить и инициализировать vector<BusStruct> или vector<BusClass> одновременно?

Ответы [ 3 ]

3 голосов
/ 17 июля 2009

Можно ли сделать то же самое, что и для структуры (т.е. объявить и инициализировать массив классов одновременно)?

Нет, если вы не создадите подходящий конструктор:

class BusClass
{
protected:
    string m_registration_number;
    string m_route;
public:
    // maybe some public functions to help initialisation
    // Indeed:
    BusClass(string const& registration_number, 
             string const& route)
    :m_registration_number(registration_number),
     m_route(route) { }
};

Или вы делаете все члены открытыми и опускаете конструктор, и в этом случае вы можете использовать тот же синтаксис инициализации, что и для структуры. Но я думаю, что это не то, что вы хотели.

Правильно ли я считаю, что невозможно объявить и инициализировать vector<BusStruct> или vector<BusClass> одновременно?

Нет, это невозможно с текущим C ++. Однако вы можете использовать библиотеки, которые делают это возможным. Я рекомендую Boost.Assign для этого. Однако для этого у вашего класса должен быть конструктор, а также и ваша структура - или вам нужно создать какую-то фабричную функцию

BusStruct make_bus(string const& registration_number, 
                   string const& route) { ... }

Если вы хотите сохранить инициализируемую структуру с помощью заключенного в скобки списка инициализаторов в других случаях.

1 голос
/ 17 июля 2009
  1. Нет, вы не сможете инициализировать классы так, как это можно делать со структурами. Но вы можете написать конструктор класса внутри объявления массива.
  2. C ++ не имеет встроенного способа инициализации векторов, если только вы не хотите загружать вектор из инициализированного вами массива.
0 голосов
/ 17 июля 2009

C ++ изначально поддерживает две формы векторной инициализации, и ни одна из них не то, что вы ищете.

1: каждый элемент такой же, как в:

vector<int> ints(4,1000); //creates a vector of 4 ints, each value is 1000.

2: скопировать из существующего вектора, как в:

vector<int> original(3,1000); //original vector has 3 values, all equal 1000.
vector<int> otherVector(original.begin(),original.end()); //otherVector has 3 values, copied from original vector
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...