Инициализация массива C ++ - PullRequest
0 голосов
/ 02 ноября 2009

приведенный ниже код выдает ошибку компиляции при попытке создать тест t [2]; потому что для этого нет конструктора по умолчанию.

Но если я создам Test t[2] = {test(1,2), test(2,3)};, тогда он работает нормально.

1) Но подумайте о ситуации, если мы хотим создать более 100 элементов массива. Нам нужно создать 100 элементов в фигурных скобках, как .. Test t [100] = {test (1,2), test (1,2) …… / 100 раз /};

Приведенный выше код трудно поддерживать. Еще одно решение - создать открытую функцию-член, которая принимает 2 целых числа и запускается в цикле. Это решает проблему, но я хочу знать любой другой хороший метод.

2) Если я создаю его, используя новый

Test *t = new test[10];

Я получаю ошибку компиляции (нет конструктора по умолчанию). Как это решить.

class test
{
    int _a;int _b;

public:
    test(int a, int b);
    void display();
};


int _tmain(int argc, _TCHAR* argv[])
{
    test t[10];

    for (int i = 0 ; i< 10; i++)
        t[i].display();
}

Ответы [ 3 ]

3 голосов
/ 02 ноября 2009

Чтобы построить ваши 10 элементов в массиве, компилятор должен каким-то образом вызывать их через конструктор. Для массивов может использоваться только конструктор по умолчанию (без аргументов), так как вы не можете передавать никакие аргументы элементам в массиве. Для этого вы должны доказать конструктор

test::test()

без аргументов.

1 голос
/ 02 ноября 2009

В вашем примере, что вы ожидаете увидеть?
Если вы это знаете, вы можете написать CTor по умолчанию (тот, у которого нет параметров) и установить значения по умолчанию.

Пример CTor по умолчанию:

// Variant 1: Use the initialization list
test()
: a(-1)
, b(-1)
{
}

// OR
// Variant 2: Do it in the CTor's body
test()
{
    a = -1;
    b = -1;
}

Примечание: Вы можете написать несколько CTors (это называется "перегрузка"). Один, который не принимает параметров и устанавливает значения по умолчанию, а другие - параметры и устанавливают эти значения.

0 голосов
/ 02 ноября 2009

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

test(int a = 0, int b = 0) :_a(a), _b(b) {}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...