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

Наследование и защищенные члены - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Класс для работы с матрицами 2х2 http://www.cyberforum.ru/cpp-beginners/thread275028.html
Доброго времени суток. Очень нужна ваша помощь . Мне нужно создать класс , обеспечивающий работу с матрицами 2х2 . В общем то , описание класса есть , меню для диалога с пользователем есть . Проблема в правильном вызове функций . Я никогда не занимался ООП и очень на вас надеюсь. Вот архив со всем проектом . Программа запускается , но пока ничего не делает ) Заранее спасибо за внимание и за...
C++ Векторное произведение Помогите пожалуйста написать программу на ВС31 или DevCpp, вот условие ввести коорбинаты N векторов на плоскости. Написать функцию, определяющую модуль векторного произведения двух векторов. Используя эту функцию найти максимальный модуль векторного произведения пары векторов. Алгоритм осуществить используя структуры. http://www.cyberforum.ru/cpp-beginners/thread275020.html
C++ Модули. Многофайловые проекты
Определить функцию, возвращающую НОД нескольких чисел. Выполнить перегрузку функции для следующих типов параметров: 7.1. Два параметра типа int. 7.2. Два параметра типа long. 7.3. Два параметра типа float. 7.4. Два параметра типа double.
Перегрузка функций C++
Определить функцию, возвращающую количество недель до конца года. Выполнить перегрузку функции для следующих типов параметров: 7.1. Структура «дата» (год, месяц, день). 7.2. Три целочисленных параметра: год, месяц, день. 7.3. Два целочисленных параметра: месяц, день (считать передаваемые числа датой текущего года).
C++ Max и Min в Си++ http://www.cyberforum.ru/cpp-beginners/thread275004.html
сформировать одномерный массив целых чисел используя ДСЧ. расспечатать полученный массив поменять местами мах и мин удалить из массива все эл. превышающие его среднее значение более чем на 10% распечатать полученный массив. #include <iostream.h> #include <conio.h>
C++ std::list присвоение указателю на структуру итератора Написал пример для показа проблемы // Почему я не могу указателю на структуру присвоить итератор? // Для sdt::vector это работает а для std::list нет #include "stdafx.h" #include <iostream> #include <list> #include <vector> using namespace std; подробнее

Показать сообщение отдельно
Selendis
1 / 1 / 0
Регистрация: 15.02.2011
Сообщений: 43
12.04.2011, 15:45     Наследование и защищенные члены
Добрый день всем.
У меня имеется следующий набор классов Visitor <- User <- Manager <- Admin
Visitor - самый базовый, надеюсь, иерархия ясна.
В каждом классе есть пара виртуальных функций, меня интересует сейчас
virtual bool set(User* user, char *nm) в классе Admin. Она должна по переданным параметрам менять атрибут name для переданного юзера и придавать ему значение строки nm.
Проблема в том, что я не могу обратиться к user->name, хотя вообще говоря нахожусь в теле потомка.
Через User может передаваться User, Manager или Admin.

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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <iostream>
 
using namespace std;
 
enum X{VIS, USE, MAN, ADM};
 
class User;
 
class Visitor
{
protected:
    char login[8];
    char *name;
    X x;
    Visitor(char l[8], char *nm, X xx = VIS)
    {
        if(strlen(l) != 7)
            cout<<"Error - login should be 7 chars long"<<endl;
        strcpy(login,l);
        name = new char[strlen(nm)+1];
        //if(!name) error
        name = strcpy(name,nm);
        //if(!name) error
    }
public:
    virtual char* getname()
    {
        return 0;
    }
    virtual void printInfo(User& user)
    {
        cout<<"Error: Unknown user"<<endl;
    }
    virtual bool set(User* user, char *name)
    {
        cout<<"Error - access denied"<<endl;
        return false;
    }
    ~Visitor()
    {
        delete[] name;
    }
};
 
class User : public Visitor
{
 
public:
    User (char l[8], char *nm):Visitor(l,nm,USE)
    {
        x = USE;
    }
    virtual char* getname() {return name;}
    virtual bool set(User* user, char *name)
    {
        cout<<"Error - access denied"<<endl;
        cout << user->name;
        return false;
    }
    virtual void printInfo(User& user)
    {
        cout<<name<<endl;
        cout<<login<<endl;
    }
    ~User() {};
};
class Manager : public User
{
public:
    Manager (char l[8], char *nm):User(l,nm)
    {
        x = MAN;
    }
    virtual char* getname() {return name;}
    virtual bool set(User* user, char *nm)
    {
        if(!nm) return false;
        
        delete[] name;
 
        name = new char[strlen(nm)+1];
 
        if(!name) return false;
 
        name = strcpy(name,nm);
 
        if(!name) return false;
 
        return true;
    }
    virtual void printInfo(User& user)
    {
        cout<<name<<endl;
        cout<<login<<endl;
    }
    ~Manager(){}
};
class Admin : public Manager
{
public:
    Admin (char l[8], char *nm):Manager(l,nm)
    {
        x = ADM;
    }
    virtual bool set(User* user, char *nm)
    {
        if(!nm) return false;
        if(this == user)
        {
            delete[] name;
            name = new char[strlen(nm)+1];
            if(!name) return false;
            name = strcpy(name,nm);
            if(!name) return false;
            return true;
        }
        cout<<"---> " << user->name;
        user->set(user,nm);     
        return true;
    }
    virtual void printInfo(User& user)
    {
        if( this != &user)
            user.printInfo(user);
        else
        {
            cout<<name<<endl;
            cout<<login<<endl;
        }
    }
    ~Admin() {}
};
int main()
{
    User u("abcdefg","S1");
    Manager m("abcdefg","S1");
    Admin a("aaaaaaa", "S2");
    Admin a1("aaaaaa1", "S3");
    /*a.printInfo(a);
    m.printInfo(m);
    u.printInfo(u);
    */
    //m.set(&m,"S123");
    //m.printInfo(m);
 
    a.set(&a1,"S321");
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 17:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru