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

Доступ к атрибуту класса по его порядковому номеру

09.11.2014, 23:14. Просмотров 848. Ответов 3
Метки нет (Все метки)

Имеется структура, нужно осуществить доступ к каждому её атрибуту по его порядковому номеру.

Например, есть структура:
struct One{int Two; double Three; char Four;}
One One[];
...

Например, нужно сделать сортировку по полю, которое выбрал пользователь, но писать для каждого поля свою функцию сортировки или пилить switch() нельзя. Возможно ли заменить это - One[i].Two; на это - One[i].[1] ?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2014, 23:14
Ответы с готовыми решениями:

Напечатать день недели по его порядковому номеру
С наступающем!!! Условие задачи: Помогите, пожалуйста!

По порядковому номеру дня недели вывести на экран его название
Помогите с заданием. Дан порядковый номер дня недели. Напишите программу,...

Написать программу, которая выводит название месяца по его порядковому номеру
Написать программу при вводе номера месяца должно выводится название этого...

Сделать функцию, которая по порядковому номеру числа Фибоначчи возвращает его значение
Сделать функцию, которая по порядковому номеру числа Фибоначчи возвращает его...

Определить дату по порядковому номеру дня года
Братцы, помогите написать 5 функций, пожалуйста! Условие: допускается...

3
mereana
0 / 0 / 2
Регистрация: 09.11.2014
Сообщений: 6
09.11.2014, 23:38 2
Лучший ответ Сообщение было отмечено drealizmo как решение

Решение

Нет, в С++ так сделать нельзя.
А для решения задачи используйте шаблонную функцию.

Добавлено через 5 минут
Вот самый простой пример реализации шаблонной функции:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream> 
 
using namespace std;
 
template <typename T> T Max(T arr[], int size) {
    T buf = arr[0];
    for (int i = 0; i < size; i++) if (buf < arr[i]) buf = arr[i];
    return buf;
}
 
void main() {
    char a[5];
    for (int i = 0; i < 5; i++) cin>>a[i];
    char res = Max(a, 5);
    cout<<res;
 
}
0
Barrent
246 / 122 / 54
Регистрация: 04.05.2013
Сообщений: 346
Завершенные тесты: 2
09.11.2014, 23:48 3
Можно так поизвращатся
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
#include "stdafx.h"
#include <windows.h>
#include <iostream>
 
struct One{
    int Two;
    double Three;
    char Four;
};
 
int _tmain(int argc, _TCHAR* argv[]){
    One one_example;
    one_example.Two = 2;
    one_example.Three = 3;
    one_example.Four = '4';
    void *first_field = &one_example;
    void *second_field = (double*)first_field + 1;      //ширина полей равна ширине наибольшего поля - double
    void *third_field = (double*)first_field + 2;
 
    std::cout << "Field Two: " << *static_cast<int *>(first_field) << std::endl;
    std::cout << "Field Three: " << *static_cast<double *>(second_field) << std::endl;
    std::cout << "Field Four: " << *static_cast<char *>(third_field) << std::endl;
    system("pause");
    return 0;
}
1
Max Dark
шКодер самоучка
1970 / 1746 / 861
Регистрация: 09.10.2013
Сообщений: 3,855
Записей в блоге: 6
Завершенные тесты: 2
11.11.2014, 09:27 4
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
#include <functional>
#include <algorithm>
#include <iostream>
#include <utility>
#include <string>
#include <vector>
 
template <class type>
using compare     = std::function<bool(const type&, const type&)>;
template<
        class classT
        >
struct field_comparer  {
    using type        = classT;
    bool operator() (const type& a, const type& b) {
        return functor (a, b);
    }
    field_comparer():functor(nullptr) {}
    field_comparer(const compare<type>& f):functor(f) {}
    field_comparer(const compare<type>&& f):functor(std::move(f)) {}
    //field_comparer(const field_comparer<type>& f):functor(f.functor) {}
    //field_comparer(const field_comparer<type>&& f):functor(std::move(f.functor)) {}
 
    template<class T>
    field_comparer<T> operator=(const field_comparer<T>& f) { functor.assign(f.functor); }
    template<class T>
    field_comparer<T> operator=(const field_comparer<T>&& f){ functor.assign(std::move(f.functor)); }
    compare<type> functor;
};
 
template<
        class classT,
        class memberT
        >
struct some:public field_comparer<classT> {
    using type        = classT;
    using member_type = memberT;
    using member_ptr  = member_type type::*;
    using compare     = std::function<bool(const member_type&, const member_type&)>;
    some(member_ptr mem, compare func)
        :member(mem), comp(func){
        this->field_comparer<type>::functor = std::bind(&some<type, member_type>::call, this,
                  std::placeholders::_1, std::placeholders::_2);
    }
    some(some<classT, memberT> const& l)
        :field_comparer<type>(l.functor),
          member(l.member), comp(l.comp){}
    some(some<classT, memberT> const&& l)
        :field_comparer<type>(l.functor),
          member(std::move(l.member)), comp(std::move(l.comp)){}
    bool call(const type& a, const type& b) {
        return comp(a.*member, b.*member);
    }
private:
    member_ptr member;
    compare    comp;
};
template<
        class classT,
        class memberT,
        class cmpT = std::less<memberT>
        >
field_comparer<classT> make_comparer(
        memberT classT::*member,
        cmpT cmp = cmpT()
        ) {
    return std::move(some<classT, memberT>(member, cmp));
}
 
struct test_idx {
    char one;
    int two;
    std::string three;
    test_idx* four;
};
int main() {
    using namespace std;
    vector<test_idx> a{
        {'a',  100500, "hello", nullptr},
        {'z', 42, "a hell", (test_idx*)(0xdead)}
    };
 
    auto print = [&a]() ->void
    {
             for(auto& i: a)
                 cout << '{'
                      << i.one << ", "
                      << i.two << ", "
                      << i.three << ", "
                      << i.four << "} ";
             cout << endl;
    };
    vector<field_comparer<test_idx>>
            one_idx{
                make_comparer(&test_idx::one),
                make_comparer(&test_idx::two),
                make_comparer(&test_idx::three),
                make_comparer(&test_idx::four)
    };
    print();
    for(auto& cmp: one_idx) {
        std::sort(a.begin(), a.end(), cmp);
        print();
    }
    return 0;
}
http://ideone.com/xu72AH - единственное место где этот код отрабатывает как задумано(g++-4.8.1)
откомпиленный у меня на компьютере крашится с Segmentation Fault
пробовал g++ 4.7.2(x32 и x64),clang++ 3.0-6.2 - Debian stable amd64, g++ 4.9.1(x32 и x64), clang++ 3.5.0 - Debian testing amd64
Вопрос на засыпку: где я здесь облажался?

Добавлено через 20 часов 1 минуту
Оказалось что можно сделать намного проще
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
#include <functional>
#include <algorithm>
#include <iostream>
#include <utility>
#include <string>
#include <vector>
 
template <class type>
using compare     = std::function<bool(const type&, const type&)>;
 
template<
        class classT,
        class memberT,
        class cmpT = compare<memberT>
        >
compare<classT> make_cmp(
        memberT classT::*member,
        cmpT cmp = std::less<memberT>()
        ) {
    return  [cmp, member](const classT& a, const classT& b) -> bool {
            return cmp(a.*member, b.*member);
    };
}
 
struct test_idx {
    char one;
    int two;
    std::string three;
    test_idx* four;
};
int main() {
    using namespace std;
    vector<test_idx> a{
        {'a',  100500, "hello", nullptr},
        {'z', 42, "a hell", (test_idx*)(0xdead)}
    };
 
    auto print = [&a]() ->void
    {
             for(auto& i: a)
                 cout << '{'
                      << i.one << ", "
                      << i.two << ", "
                      << i.three << ", "
                      << i.four << "} ";
             cout << endl;
    };
    vector<compare<test_idx>>
        idx_two{
        make_cmp(&test_idx::one),
        make_cmp(&test_idx::two),
        make_cmp(&test_idx::three),
        make_cmp(&test_idx::four)
    };
    for (auto& cmp : idx_two) {
        std::sort(a.begin(), a.end(), cmp);
        print();
    }
    return 0;
}
http://ideone.com/a4gK2y
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2014, 09:27

Определить, кратны ли числа последовательности своему порядковому номеру
1.Дана последовательность целых чисел, конец которой обозначен нулём.Определить...

Определить, кратны ли числа последовательности своему порядковому номеру
Дана последовательность целых чисел, конец которой обозначен нулем....

Распечатать квадраты всех нечетных чисел от 1 до N, кратных порядковому номеру текущего числа
Распечатать квадраты всех нечетных чисел от 1 до N, кратных порядковому номеру...


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

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

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