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

"Двойной" доступ к переменным класса - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ С++, какую среду разработки выбрать? http://www.cyberforum.ru/cpp-beginners/thread713444.html
Появилось желание изучить язык программирования. Собственно, интересует какая разница, и существует ли она вообще между С++ и Visual C++? Какую среду разработки используют профессиональные программисты?
C++ Описать структуру ZNAK Описать структуру ZNAK, содержащую следующие поля: • Фамилия, имя • Знак зодиака • Дата рождения (массив из 3 чисел). Программа должна выполнять следующие действия: • Ввод с клавиатуры данных в массив, состоящий из n элементов типа ZNAK; записи должны быть упорядочены по датам рождения; • Вывод на экран информации о человеке, чья фамилия введена с клавиатуры; Если такого нет, выдать на... http://www.cyberforum.ru/cpp-beginners/thread713435.html
C++ CUDA на примерах
Скомпилировал из данной книги несколько вариантов программы(не важно какой): с глобальной, константной, текстурной памятью. Измерил, как описано в коде, время выполнения кода CUDA функциями: cudaEventCreate(), cudaEventRecord(), cudaEventElapsedTime() на старой паршивой карте: Asus NVidia GeForce 8500 GT. Все работает и время выполнения каждого варианта получаю разное,-в зависимости от...
C++ Сортировка массива указателей на абстрактный базовый класс
Я создал абстрактный базовый класс (с названием Base) и два производных класса (с названиями Two и Three). После инициализации объектов производных классов каждый из этих объектов имеет два данных-члена: string и double. Вопрос: как можно организовать сортировку всех созданных объектов (и объектов Two, и объектов Three)? Первое мое действие - я создаю массив указателей на АБК Base и помещаю в...
C++ Контроль ввода http://www.cyberforum.ru/cpp-beginners/thread713413.html
Задача: написать программу, которая дает пользователю ввести массив, а потом при помощи функции подсчитать символы. Вот код: #include <iostream> using namespace std; const int ArSize=10; void strcount(const char * str); int main() { char input; char next; cout<<"Enter a line:\n";
C++ Удаление и добавление звена в линейном списке Здравствуйте тётеньки и дяденьки!!!...Помогите мне дописать код... Задача: Картотека в бюро обмена квартир организована в виде линейного списка. Сведения о каждой квартире включают: -количество комнат; -этаж; -площадь; -адрес. Написать программу, которая обеспечивает: -начальное формирование картотеки; -ввод заявки на обмен; подробнее

Показать сообщение отдельно
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.12.2012, 19:16     "Двойной" доступ к переменным класса
Т.е. ты хочешь (например) получить элемент типа UniformType, расположенного по индексу 1 и вызвать для него метод toTypeB и, чтобы при попытке вызова других методов происходила ошибка, желательно времени компиляции? Теперь я правильно тебя понял?

Если сделать индексацию через параметр шаблона, то можно и в compile-time реализовать. В 11 версии, возможно, и без шаблонов можно будет, если обозначить функцию как константу времени компиляции, но в этом вопросе я не компетентен, так что сомневаюсь. В runtime можно реализовать с использованием RTTI.

Добавлено через 1 минуту
Если не секрет, что за внешний модуль? Хочется знать, чтобы держаться от этого разработчика подальше.)

Добавлено через 5 минут
И ещё смущают вот эти методы:
C++
1
TypeA&  toTypeA(bool& isOK) const;
либо ты сократил и не указал константность возвращаемой ссылки, либо возвращается ссылка на временный объект.

Добавлено через 24 минуты
Невинная фантазия на данную тему. Только тебе не подойдёт, скорее всего, потому что состав объектов другой получился

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
#include <iostream>
 
typedef int TypeA;
typedef double TypeB;
 
 
class UniformType
{
public:
    UniformType()
        : _type(-1)
        , _ptr(0)
    {   }
 
    ~UniformType()
    {
        delete _ptr;
    }
 
    UniformType( UniformType & rhs)
        : _type(-1)
        , _ptr(0)
    {
        DeepCopy(rhs);
    }
 
    explicit UniformType(const TypeA& _a)
        : _type(0)
    {
        _ptr = new TypeA(_a);
    }
 
    explicit UniformType(const TypeB& _b)
        : _type(1)
    {
        _ptr = new TypeB(_b);
    }
 
    UniformType& operator =( UniformType rhs )
    {
        DeepCopy( rhs );
        return *this;
    }
 
    void DeepCopy( UniformType & rhs)
    {
        delete _ptr;
 
        _type = rhs._type;
 
        switch( _type )
        {
        case 0:
            _ptr = new TypeA(rhs.toTypeA()); break;
        case 1:
            _ptr = new TypeB(rhs.toTypeB()); break;
        }
    }
 
    TypeA & toTypeA()
    {
        if( _type != 0 ) throw int(0);
        return *reinterpret_cast<TypeA*>(_ptr);
    }
 
    TypeB & toTypeB()
    {
        if( _type != 1 ) throw double(1);
        return *reinterpret_cast<TypeB*>(_ptr);
    }
 
private:
    int _type;
 
    void * _ptr;
};
 
 
class EnumerousVariables
{
public:
    EnumerousVariables()
    {
        _u[0] = UniformType(10);
        _u[1] = UniformType(3.14);
    }
 
    TypeA&  getA()
    {
        return _u[0].toTypeA();
    }
    TypeB&  getB()
    {
        return _u[1].toTypeB();
    }
 
    UniformType& operator [] (int i)
    {
        return _u[i];
    }
 
private:
    UniformType _u[2];
};
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    EnumerousVariables ev;
 
    std::cout << ev[0].toTypeA() << "\n";
    std::cout << ev[1].toTypeB() << "\n";
//  std::cout << ev[1].toTypeA();
 
    return 0;
}
 
Текущее время: 04:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru