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

Не удается запустить указатель метода по указателю класса - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" http://www.cyberforum.ru/cpp-beginners/thread1637144.html
Мне надо решение упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++". Хотя бы какая-то часть
C++ Влияние абсолютного значения константы и использованных в ее изображении суффиксов L, U на тип данных Нужно проиллюстрировать влияние абсолютного значения константы и использованных в ее изображении суффиксов L, U на тип данных, который и присваивается на этапе компиляции. Программу я сам попробую... http://www.cyberforum.ru/cpp-beginners/thread1637132.html
Передача по ТСР C++
Всем привет, помогите начинающему, задача в том что бы с программы сервер передать текст из эдитов клиенту в лабелы, на данном этапе могу сделать что то локального чата, но это не то ((( Прошу...
Найти сумму указанных элементов в заданной матрице и количество столбцов, удовлетворяющих условию C++
Заполнить случайными числами матрицу размерностью NxM. Определить: 1-й вариант: Сумму положительных элементов в нечетных столбцах; Кол-во столбцов, содержащих хотя бы один нулевой элемент ...
C++ Как лучше построить механизм обработки ошибок на основе исключений? http://www.cyberforum.ru/cpp-beginners/thread1637103.html
Доброго дня! Я сейчас разрабатываю проект и хочу спросить: как лучше построить механизм обработки ошибок на основе исключений? Есть как минимум два варианта. 1) Создать иерархию классов...
C++ Переписать программу в соответствии с принципами написания хорошего кода, реализовать файловый ввод/вывод Имеется код. Нужно показывать на экзамене. У меня возникло несколько сложностей. Мне нужно его украсить, чтобы было видно хорошее программирование и функция открытия файла почему-то не работает, хотя... подробнее

Показать сообщение отдельно
xlxndr
57 / 9 / 3
Регистрация: 14.06.2013
Сообщений: 115

Не удается запустить указатель метода по указателю класса - C++

12.01.2016, 20:14. Просмотров 183. Ответов 1
Метки (Все метки)

Первый класс - бесцветная (белая) линия,
Второй класс - цветная линия.
Если взять два указателя на данные классы и по ним указатель метода (он единственный - Draw()), то один класс рисуется, второй - не рисуется... Почему?...
Если поменять местами CL1 и CL2 (соответственно от CLB будет наследоваться не CL1, а CL2, а CL1 будет наследоваться от CL2), то тогда наоборот - рисуется цветная линия, а бесцетная не рисуется...

Классы описаны в файле:
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
//expclasses6.h
 
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <graphics.h>
#include <math.h>
using namespace std;
 
class CLB
{
protected:
        int ln;              //используется в CL1
        int c;              //используется в CL2
public:
        CLB()              {           }
        void Show()        {   Draw(); }
        virtual void Draw(){           }
};
 
class CL1: public CLB
{
public:
        CL1():CLB(){SetParam();}
        virtual void SetParam(int MaxL=800)
        {   ln=1+rand()%MaxL;    }
        virtual void Draw()
        {   line(100,ln,100+ln,ln);    }
};
 
class CL2: public CL1
{
 
public:
        CL2():CL1(){SetParam();}
        virtual void SetParam(int MaxL=800,int InitC=3)
        {   ln=1+rand()%MaxL;    c=InitC;   }
        virtual void Draw()
        {   setcolor(c); line(100,ln,100+ln,ln);   }
};
Программа в файле:

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
//main.cpp
 
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <graphics.h>
#include <math.h>
using namespace std;
#include "expclasses6.h"
 
typedef void (CLB::* CLBMethod)();
 
int main(int argc, char*argv[])
{
    srand(time(NULL));
    CL1 c1;
    CL2 c2;
    CLB* clink;                     //создаем указатель на базовый класс
    CLBMethod mlink = &CLB::Show;   //создаем указатель на метод базового класса
 
    initwindow(800,600);
    clink = &c1;                    //рисуем экземпляр первого класса
    (clink ->* mlink)();
 
    getch();                        //ощищаем экран по нажатию
    cleardevice();
 
    clink = &c2;                    //рисуем экземпляр второго класса
    (clink ->* mlink)();
 
    getch();
    closegraph();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru