0 / 0 / 1
Регистрация: 09.11.2014
Сообщений: 10
1

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

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

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

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

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

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

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

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

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

3
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
252 / 128 / 54
Регистрация: 04.05.2013
Сообщений: 346
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
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,260
Записей в блоге: 7
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
11.11.2014, 09:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.11.2014, 09:27
Помогаю со студенческими работами здесь

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

Определение квартала года по порядковому номеру месяца
Написать программу определения квартала года по порядковому номеру месяца.

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru