Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Ошибка при вызове конструктора с параметрами - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Новый масив из уникальных элементов другого массива http://www.cyberforum.ru/cpp-beginners/thread709358.html
Здравствуйте, помогите сделать функцию которая генерирует новый массив из элементов, которые не повторяются в другом массиву. Заранее спасибо.
C++ Все элементы вектора, которые встречаются более одного раза, переписать в другой вектор Все элементы вектора V,которые встречаються более одного раза ,переписать в другой вектор. Задача на С++ помогите решить. http://www.cyberforum.ru/cpp-beginners/thread709355.html
C++ Работа с шрифтами
Заносим в массив кнопки с диалогового окна: for(int index = 0; index < CONTROL_BUTTON_COUNT; index++) DDX_Control(pDX, index + 1000, ControlButtons); .... Устанавливаем текст кнопки и ее...
найдите пожалуйста ошибку C++
почему то слепляет возраст и имя 2го и 3го рабочих #include <stdio.h> #include <stdlib.h> #include <conio.h> main() { int vA,vB,vC; char a; char b; char c;
C++ Как связать два cpp файла в одном проекте (visual studio 2010) http://www.cyberforum.ru/cpp-beginners/thread709325.html
Есть два программы: одна создает файл.txt, вторая читает из него данные и выводит на экран. создает файл #include <iostream> #include <fstream> #include <string> using namespace std; void...
C++ Найти ошибку в коде пожалуйста найдите ошибку((( #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <math.h> #define FALSE 0 #define TRUE 1 void menu(void); подробнее

Показать сообщение отдельно
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
26.11.2012, 22:09
ОК, давай сначала.
Ты знаешь как пользоваться указателями?
Я предположил, что знаешь, судя по тому, что память под динамический массив выделять умеешь.
Напомню, указатель А на любой тип Т объявляется как

Т* А;

Оператор new возвращает нам указатель на первый элемент выделенного массива. вот как мы его используем.
то есть, чтобы иметь массив из элементов типа Т, нужно иметь указатель на Т и выделить память как

Т* A=new T[12]; (формула 1)

Это ясно. В твоём примере T это Country, т.е. сам объект, т.е. в массиве будет последовательно идти несколько больших кусков памяти, содержащих Name_Country;Naselenije и Forma_Pravl; и идущих друг за другом.
И что важно!(и является причиной отказа от твоего способа) Эти хранимые нами объекты будут созданы именно в этот момент! То есть для каждого объекта будет вызван конструктор. Но ведь мы ещё не решили какие из них с континентами, а какие нет. Более того: даже если б мы решили это, С++ нам просто не позволит хранить объекты разных типов в массиве. Ведь неспроста массивы имеют тип. В массиве нельзя хранить объекты разного размера и вообще... Класс Country абстрактный и даже еслиб захотели создать одного типа, мы б не создали массив объектов класса Country.

Я же выделяю массив не из 12 элементов, а из 12 указателей. Что это даёт? Каждый указатель имеет одинаковый размер, при создании массива указателей не создаётся никаких объектов, на которые они указывают: указатели неинициализированы, никаких конструкторов не вызывается. Это просто ячейки для хранения адресов в памяти, в которых пока случайный мусор. У них нет полей Name_Country;Naselenije и Forma_Pravl; Это не объекты это указатели на будущие наши объекты.
Следовательно, конструктор какого объекта будет вызван для каждой из 12 стран мы определяем уже после выделения массива.

Итак, как выделить массив указателей? Подставляем в формулу 1 вместо типа Т тип указателя на страну (Country*) и получаем

Country** A= new Country* [12];

Теперь ясно, откуда 2 звёздочки?

Теперь каждую страну можно создать отдельно друг от друга и в качестве создаваемой страны можно выбрать любого неабстрактного наследника класса Country.

В цикле по i даём команду

A[i]=new Coutnry_without_islands; //или без островов... - в зависимости от i

Это даёт нам возможность в дальнейшем обращаться ко всем странам вне зависимости с островами они или нет. Без всяких if(c==1){
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru