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

Наследование, dynamic_cast и использование последнего в связке с первым - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ практика на экзамене http://www.cyberforum.ru/cpp-beginners/thread548961.html
вобщем я перездаю экзамен и мне дано задание:"написать консольное приложение , которое позволяет пользователю ввести с клавиатуры 10-ть дробных чисел и вывести на экран максимальное число из этого...
C++ B-Дерево. Поиск. Вставка. Удаление. Доброго всем дня,есть задача: Написать программу реализующую следующие действия в B-Дереве: Поиск. Вставка. Удаление. Так же у меня есть готовая программа на Delphy, если вдруг кто сможет... http://www.cyberforum.ru/cpp-beginners/thread548958.html
Перегрузка операторов для класса МАССИВ C++
Привет. Есть класс "вектор" ("массив"), нужно переопределить операторы =, +, - , *, +=, -=, *= с целым числом. =, +=, -=, *=, как функции члены +, - , * как дружественные функции Вопрос вот...
Как в C++ реализовать такое вычисление (1/2tg(0.7x))* ((ln(x+1.48))/2)) C++
Уважаемые знатоки, как в C++ реализовать такое вычисление (1/2tg(0.7x))* ((ln(x+1.48))/2)) при помощи использования библиотеки OpenMP, для подсчёта времени на вычисление этого выражения каждым...
C++ Работа перемещающего загрузчика http://www.cyberforum.ru/cpp-beginners/thread548943.html
Добрый день, необходимо разработать приложение, моделирующее работу перемещающего загрузчика. Программа считывает двоичный файл следующей структуры: N A1 A2 ... AM D0 D1 ... DK N - кол-во ячеек с...
C++ Как организовать переменную ошибки? Привет Что такое вроде понятно. Например переопределяем оператор для массива, если запрашиваем индекс больше чем размер массива-то выводим сообщение об ошибке и прекращаем работу данной... подробнее

Показать сообщение отдельно
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
15.04.2012, 15:34  [ТС]
Цитата Сообщение от alex_x_x Посмотреть сообщение
все - в этом месте реальный тип объекта разрушается
чтобы такого не случалось CControl должен быть абстрактным
Не получается что-то, в общем смотрите как сейчас я решил проблему:
class CControl не абстрактный, от него унаследованы CComboBox, CInput, CButton и CLabel.
Для каждого из них пришлось добавить метод Add ( я понимаю что это плохо), тоесть
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
    CWindow& Add(const CComboBox& obj)
    {
        if(! head)
        {
            head= tail= new ListControl;
            head->control= new CComboBox(obj);
            Recalculate(head->control);
            head->next= NULL;
        }
 
        else
        {
            ListControl* toAdd= new ListControl;
            toAdd->control= new CComboBox(obj);
            toAdd->next= NULL;
            Recalculate(toAdd->control);
            tail->next= toAdd;
            tail= toAdd;
        }
 
        countCB++;
        return *this;
    }
 
 
    CWindow& Add(const CInput& obj)
    {
        if(! head)
        {
            head= tail= new ListControl;
            head->control= new CInput(obj);
            Recalculate(head->control);
            head->next= NULL;
        }
 
        else
        {
            ListControl* toAdd= new ListControl;
            toAdd->control= new CInput(obj);
            toAdd->next= NULL;
            Recalculate(toAdd->control);
            tail->next= toAdd;
            tail= toAdd;
        }
        return *this;
    }
 
    CWindow& Add(const CLabel& obj)
    {
         //считай тоже самое
        return *this;
     }
    CWindow& Add(const CButton& obj)
    {
     //считай тоже самое
        return *this;
    }
Напомню что список что помнит все контролы реализован так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    struct ListControl
    {
        ListControl()
        :control(NULL), next(NULL){}
 
        ListControl(const CControl& cont)
        :control(new CControl(cont)), next(NULL) {}
 
        ListControl(const CComboBox& cont)
        :control(new CControl(cont)), next(NULL) {}
 
        CControl* control;
        ListControl* next;
    } * head, *tail;
Если я сделаю класс CControl полностью виртуальным -> я не смогу создавать объекты такого класса -> что же я буду делать при добавлении контролов?

Итого придётся убрать конструкторы у структуры ListControl:
C++
1
2
3
4
5
6
7
    struct ListControl
    {
        ListControl()
        :control(NULL), next(NULL){}
        CControl* control;
        ListControl* next;
    } * head, *tail;
А метод Add сделать таким что будет принимать ссылку на CControl:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    CWindow& Add(const CControl& obj)//я без понятия что мне здесь передали
    {
        if(! head)
        {
            head= tail= new ListControl; //конструктор по умолчанию CControl* control= NULL
            head->control= new CControl(obj);//ну а тут мне чего делать? Объект типа CControl создавать же нельзя теперь
            Recalculate(head->control);
            head->next= NULL;
        }
 
        else
        {
            ListControl* toAdd= new ListControl;
            toAdd->control= new CControl(obj);
            toAdd->next= NULL;
            Recalculate(toAdd->control);
            tail->next= toAdd;
            tail= toAdd;
        }
        return *this;
    }
Добавлено через 4 минуты
Цитата Сообщение от alex_x_x Посмотреть сообщение
но так как это не так, то первоначально нужно использовать указатель CControl*
Вот это не понял. Опишите подробнее пожалуйста.

Добавлено через 35 секунд
Цитата Сообщение от alex_x_x Посмотреть сообщение
странно, что компилятор это стерпел
даже предупреждением не пискнул.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru