Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 04.09.2017
Сообщений: 6
1

"Сигнатура" внутри класса/структуры - можно ли?

25.02.2020, 18:27. Просмотров 983. Ответов 5

Приветствую форумчан!

Есть функция, принимающая void*.
Допустим, я хочу передавать этой функции указатель на два различных вида структур и, в зависимости от структуры, функция будет работать по-разному.

Вопросы:
1. Гарантируется ли, что в любой структуре по её начальному адресу находится первая переменная из её определения?
2. Это очень плохой стиль программирования?

Код для примера, очень далекий от реальной задачи.


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
struct type1 {
    int signature = 1;
    int data = 1234;
};
struct type2 {
    int signature = 2;
    int value = 2345;
};
 
void func (void *ptr) {
    if (  *((int*) ptr) == 1) {
        type1 *a = (type1 *) ptr;
        std::cout << a->data;
    }
    if (  *((int*) ptr) == 2) {
        type2 *b = (type2 *) ptr;
        std::cout << b->value;
    }
    return;
}
 
int main() {
    type1 a;
    type2 b;
 
    func ( (void*)&a);
    func ( (void*)&b);
 
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.02.2020, 18:27
Ответы с готовыми решениями:

Чтения структуры из файла (описать структуру с именем "ORDER": "счет плательщика"; "счет получателя"; "сумма, переводится банковской операцией")
Описать структуру с именем &quot;ORDER&quot;, содержащий следующие поля: &quot;Счет плательщика&quot;; &quot;Счет...

Создание динамических массивов внутри класса: Нарушение прав доступа при чтении "0xbf800000"
столкнулся с непонятной для меня бедой. Если код написать внутри главной функции то всё работает....

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;,...

Объяснить что такое "раздельная компиляция", что такое "интерфейс класса" и "реализация класса" на примере
Есть класс, содержащий объекты и конструктор. Конструктор объявляется в одном из cpp файлов(их...

5
334 / 235 / 102
Регистрация: 26.03.2019
Сообщений: 407
25.02.2020, 18:37 2
А чем абстрактные классы не угодили?
1
0 / 0 / 0
Регистрация: 04.09.2017
Сообщений: 6
25.02.2020, 18:49  [ТС] 3
Тем, что классы большие, очень сильно отличаются и их код уже отлажен.
К тому же, если я правильно понял, приведение указателей все равно придется делать.
0
3646 / 2071 / 863
Регистрация: 07.02.2019
Сообщений: 5,501
25.02.2020, 18:54 4
Цитата Сообщение от data4344 Посмотреть сообщение
1. Гарантируется ли, что в любой структуре по её начальному адресу находится первая переменная из её определения?
только для standard layout types
Цитата Сообщение от data4344 Посмотреть сообщение
2. Это очень плохой стиль программирования?
да

В С++ есть перегрузка функций
1
0 / 0 / 0
Регистрация: 04.09.2017
Сообщений: 6
27.02.2020, 22:08  [ТС] 5
Попытался разобраться с интерфейсами. Так можно или пока ещё не очень?
Приведение к type1* и type2* внутри func() допустимы?
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
#include <iostream>
 
 
class Interface {
public:
    virtual int signature () = 0;
    virtual ~Interface ();
};
Interface::~Interface () {
};
 
class type1: public Interface {
public:
    int data = 1234;
    int signature ();
    virtual ~type1 ();
};
int type1::signature () {
    return 1;
};
type1::~type1 () {
};
 
 
class type2: public Interface {
public:
    int value = 2345;
    int signature ();
    virtual ~type2 ();
};
int type2::signature () {
    return 2;
};
type2::~type2 () {
};
 
void func (Interface *ptr) {
    if (ptr->signature() == 1) {
        type1 *a = (type1 *)ptr;
        std::cout << a->data << "\n";
    }
    if (ptr->signature() == 2) {
        type2 *b = (type2 *)ptr;
        std::cout << b->value << "\n";
    }
    return;
}
 
int main() {
    type1 a;
    type2 b;
 
    func (&a);
    func (&b);
 
    return 0;
}
0
334 / 235 / 102
Регистрация: 26.03.2019
Сообщений: 407
27.02.2020, 22:13 6
Лучший ответ Сообщение было отмечено data4344 как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
void func (Interface *ptr) {
    //if (ptr->signature() == 1) {
    if(type1* a = dynamic_cast<type1*>(ptr)) {
        //type1 *a = (type1 *)ptr;
        std::cout << a->data << "\n";
    }
    else if (type2* b = dynamic_cast<type2*>(ptr)) {
        //type2 *b = (type2 *)ptr;
        std::cout << b->value << "\n";
    }
    return;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.02.2020, 22:13

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Реализация класса "Студент" и наследование от него класса "Аспирант"
Помогите, пожалуйста! Создать абстрактный базовый класс Person, описывающий обычного человека....

Разработка класса String, на основании которого можно создавать объекты типа "строка символов"
Дали задание сделать класс строка. Класс должен давать возможность создавать программы, в которых...

Создание структуры "префиксное дерево". Ошибка "Access violation writing location".
Есть структура данных - бор или префиксное дерево. class trie { char value; // символ узла...

Заполнить структуры "Прямоугольник" и "Треугольник" и найти площади и периметры фигур
Доброго времени суток! Начали изучать структуры, сижу над задачкой, да вот не идет она у меня....


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

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

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