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

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

Войти
Регистрация
Восстановить пароль
 
xlxndr
57 / 9 / 3
Регистрация: 14.06.2013
Сообщений: 115
#1

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

12.01.2016, 20:14. Просмотров 185. Ответов 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
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2016, 20:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не удается запустить указатель метода по указателю класса (C++):

Вызов динамического метода класса по указателю на объект класса - C++
Как это можно сделать? И хотелось бы как можно проще.

Указатель на метод класса в качестве аргумента метода класса - C++
Функция _createFun вызывается для создания ХХХ в основном классе. Но вот потребовалось создать ХХХ в дополнительном классе. Вопрос: как...

Не удается обратиться к свойству класса из метода класса - C++
Пишу хедер для работы с файлами такой структуры: nametype1 name1 name2 name3 name4 nametype2

Не удается разыменовать указатель на объект класса - C++
Добрый день, знатоки c++. Пишу программу, уровень знаний базовый. Нуждаюсь в совете профессионалов. Создал класс node. ClassNode.h: ...

Вызов метода класса через указатель на ноль - C++
Почему в таком коде не происходит ошибка при вызове метода класса, а уже только в самом методе: struct A { int a; void...

Указатель на объект в качестве параметра вызываемого метода класса - C++
Код по сути //Interface.cpp #include &quot;Interface.h&quot; void Interface::input() { Teplitsa *kaka; kaka = new Teplitsa; ...

1
nord_v
228 / 177 / 69
Регистрация: 22.08.2013
Сообщений: 724
13.01.2016, 11:00 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от xlxndr Посмотреть сообщение
Почему?...
Цитата Сообщение от xlxndr Посмотреть сообщение
virtual void SetParam(int MaxL=800)
Цитата Сообщение от xlxndr Посмотреть сообщение
virtual void SetParam(int MaxL=800,int InitC=3)
Цитата Сообщение от xlxndr Посмотреть сообщение
initwindow(800,600);
Координата за пределы окна выходит (если не выходит, то рисует):
C++
1
2
3
4
virtual void SetParam(int MaxL = 590)
{
virtual void SetParam(int MaxL = 590, int InitC = 3)
{
1
Миниатюры
Не удается запустить указатель метода по указателю класса  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2016, 11:00
Привет! Вот еще темы с ответами:

Почему не возвращается значение через указатель из метода класса? - C++
Вот решил проверить поведение указателя в программе (я только учу C++), как оказалось после выхода из метода, указатель не указывает на...

Вызов метода производного класса через указатель на базовый класс - C++
Всем привет ! Подскажите почему , при выполнении строки 45 я получаю ошибку ? А именно при выполнении выражения c-&gt;fnz() ...

Как получить значение из метода класса, если метод возвращает указатель? - C++
Всем привет. Как получить значение из метода класса, если метод возвращает указатель? Вот тут я пилю типо класса аккаунтов, у меня не...

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


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

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

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