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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Kvayzer
0 / 0 / 1
Регистрация: 30.12.2013
Сообщений: 56
#1

"динамически выделяет массив указателей на базовый класс" - как это понять? - C++

12.11.2015, 15:44. Просмотров 445. Ответов 8

Что значит вообще массив на класс? Я не совсем понимаю, мы ведь оперируем понятием объекта, а класс - это всего лишь тип. Нам нужно создать массив типов? Что тут сделать надо?

C++
1
2
3
4
5
6
7
8
class A {};
//................................................................
int main()
{
A* obj[n]; 
for (int i=0; i<n; i++)
     obj[i]=new A(i);  
}
Мне вот это надо сделать? Но это же массив массив указателей на объекты, а не на класс.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2015, 15:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос "динамически выделяет массив указателей на базовый класс" - как это понять? (C++):

Создать базовый класс "Массив" и класс-наследник "Матрица" - C++
Добрый день! такой вопрос, как задать двумерный массив и заполнить его рандомными числами. и как его реализовать используя абстрактные...

typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения - C++
Вот код: #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;typeinfo&gt; using...

Базовый класс "Источник напряжения", производные классы "Цепь" и "Аккумулятор" - C++
Дали задачу по программированию: составить класс &quot;Источник напряжения&quot;, для которого нужно реализовать два производных класса: &quot;Цепь&quot; и...

Базовый класс "многоугольник" и производные классы "треугольник" и "прямоугольник" - C++
Не могу понять как реализовать данное задание. Создать 1 базовый класс и несколько производных.Все небольшие ф-ии сделать встроенными...

Абстрактный базовый класс "звонок" с виртуальной функцией "стоимость" - C++
Помогите пожалуйста очень надо (классы это не мое) полиморфизм Поступающие звонки оператор классифицирует (т.е. в какой город, регион, ...

массив указателей на базовый класс - C++
покажите пожалуйста на простом примере)))(а то я не оч понимаю:cry:)

8
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
12.11.2015, 15:49 #2
Цитата Сообщение от Kvayzer Посмотреть сообщение
вообще массив на класс?
бред

Добавлено через 31 секунду
Цитата Сообщение от Kvayzer Посмотреть сообщение
Я не совсем понимаю, мы ведь оперируем понятием объекта, а класс - это всего лишь тип. Нам нужно создать массив типов?
а где это было вычитано? Я про указатели на класс
0
Kvayzer
0 / 0 / 1
Регистрация: 30.12.2013
Сообщений: 56
12.11.2015, 15:55  [ТС] #3
Цитата Сообщение от Croessmah Посмотреть сообщение
а где это было вычитано? Я про указатели на класс
Скажите просто, код выше подходит под фразу: "динамически выделяет массив указателей на базовый класс" ?
Эта формулировка части задания в одной из лаб.
..."Написать тестовую программу, которая:
 динамически выделяет массив указателей на базовый класс (4-6);...
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
12.11.2015, 16:05 #4
Цитата Сообщение от Kvayzer Посмотреть сообщение
Скажите просто, код выше подходит под фразу
нет.

Может подойти что-то подобное:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class One
{
} ;
 
class Two : public One
{
} ;
 
int main()
{
    One ** ptr = new One*[10] ;
}
1
Kvayzer
0 / 0 / 1
Регистрация: 30.12.2013
Сообщений: 56
12.11.2015, 16:31  [ТС] #5
Цитата Сообщение от Croessmah Посмотреть сообщение
Может подойти что-то подобное:
То есть что от меня хотят дальше тогда?

..." динамически выделяет массив указателей на базовый класс (4-6);
 в режиме диалога заполняет этот массив указателями на производные классы, при этом экземпляры производных классов создаются динамически с заданием начальных значений;"..

Что значит, заполняет указателями?

Можно даже без указателей, а просто в пример двумерный массив привести.
То есть это матрица, где в каждой строке у нас N производных объектов класса от какого-то M базового объекта класса? И нужно эту матрицу сделать динамической.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
12.11.2015, 16:48 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//Title of this code
//g++  4.9.2
 
#include <iostream>
 
 
class One
{
public:
    virtual void foo () { std::cout << "One" << std::endl ; }
    virtual ~One() {}
} ;
 
class Two : public One
{
public:
    virtual void foo () { std::cout << "Two" << std::endl ; }
    virtual ~Two() {}
} ;
 
 
class Three : public One
{
public:
    virtual void foo () { std::cout << "Three" << std::endl ; }
    virtual ~Three() {}
} ;
 
 
 
 
 
int main()
{
    size_t size = 5 ;
    One ** ptr = new One*[size] ;
    for ( size_t i = 0 ; i < size ; ++i )
    {
        char choose = 0 ;
        std::cout << "Choose object type:\n\tDefault - One\n\t2 - Two\n\t3 - Three\n\t->" ;
        std::cin >> choose ;
        switch (choose)
        {
            case '2' :
                ptr[i] = new Two() ;
                break ;
            case '3' :
                ptr[i] = new Three() ;
                break ;
            default :
                ptr[i] = new One() ;
                break ;
        } ;
    }
    std::cout << "\n\nResults:" << std::endl ;
    for ( size_t i = 0 ; i < size ; ++i )
    {
        ptr[i]->foo() ;
    }
    for ( size_t i = 0 ; i < size ; ++i )
    {
        delete ptr[i] ;
    }
    delete [] ptr ;
}
http://rextester.com/KXJTJ92481

"Заполняется значениями", думаю, сами организуете.
1
Lensato
49 / 49 / 24
Регистрация: 07.10.2015
Сообщений: 170
12.11.2015, 16:59 #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <conio.h>
#include <stdio.h>
#include <iostream>
 
class One
{ 
public:
    int num = -1;
    One() { }
};
 
class Two : public One
{ 
private:
    int number = 0;
    int size = 0;
    One **base_class;
 
public:
    Two() { }
 
    Two(int i)
    {
        number = i;
    }
 
    void SetMassiveOfBaseClass()
    {
        std::cout << "Enter massive size: ";
        std::cin >> size;
 
        base_class = new One *[size];
 
        for (int i = 0; i < size; i++)
            base_class[i] = new Two(i);
    }
 
    void Show()
    {
        for (int i = 0; i < size; i++)
            std::cout << "Element number " << i << " = " << base_class[i]->num << " but if it is a Two, then " << ((Two *)base_class[i])->number << std::endl;
    }
 
};
 
int main()
{
    Two two;
    two.SetMassiveOfBaseClass();
    two.Show();
    system("pause");
}
1
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
12.11.2015, 17:01 #8
Lensato, виртуальный деструктор? Явное и жесткое приведение указателя? Освобождение ресурсов?
1
Lensato
49 / 49 / 24
Регистрация: 07.10.2015
Сообщений: 170
12.11.2015, 17:20 #9
Цитата Сообщение от Croessmah Посмотреть сообщение
виртуальный деструктор? Явное и жесткое приведение указателя? Освобождение ресурсов?
?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <conio.h>
#include <stdio.h>
#include <iostream>
 
class One
{
public:
    int num = -1;
    One() { }
    virtual char * ShowClassName()
    {
        return "one";
    }
    virtual ~One() { }
};
 
class Two : public One
{
private:
    int number = 0;
    int size = 0;
    One **base_class;
 
public:
    Two() { }
 
    Two(int i)
    {
        number = i;
    }
 
    virtual ~Two() { }
 
    void SetMassiveOfBaseClass()
    {
        std::cout << "Enter massive size: ";
        std::cin >> size;
 
        base_class = new One *[size];
 
        for (int i = 0; i < size; i++)
            base_class[i] = new Two(i);
    }
 
    void Show()
    {
        for (int i = 0; i < size; i++)
        {
            std::cout << "Element number " << i << " = " << base_class[i]->ShowClassName() << std::endl;
        }
    }
 
    void FreeMemory()
    {
        for (int i = 0; i < size; i++)
            delete base_class[i];
 
        delete [] base_class;
    }
 
    char * ShowClassName()
    {
        return "two";
    }
 
};
 
int main()
{
    Two two;
    two.SetMassiveOfBaseClass();
    two.Show();
    two.FreeMemory();
    system("pause");
}


Вообще, явное приведение базового класса к производному однозначно не правильно?
Точно знаю, что производный к базовому, без проблем.
Честно говоря пока не разобрался в деталях где и как хранится память и правильно ли будет считана при таких преобразованиях.
1
12.11.2015, 17:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2015, 17:20
Привет! Вот еще темы с ответами:

Реализовать базовый класс "Футбольная команда" и класс-наследник с методами консольного ввода/вывода - C++
Составить программу на языке С++, в которой описывается класс (с добавлением наследуемого подкласса) с методами ввода с клавиатуры и вывода...

Определить базовый класс "Матрица" и класс-потомок "Треугольная матрица" - C++
Нужно определить класс &quot;матрица&quot; с возможностью динамического выделения и освобождения памяти, наполнения матрицы, сохранения и чтения из...

Ошибка компиляции - "класс" : базовый класс не определен - C++
Помогите пожалуйста, у меня в проекте есть несколько классов, которые имеют отдельные header и implementations, когда я их всех...

Базовый класс "Летательный аппарат" и производные классы Ракета и Самолет - C++
Определить абстрактный базовый класс &quot;Летательный аппарат&quot; содержащий данные, описывающие название, стартовую массу аппарата. В этом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru