Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

Получения количества полей класса - C++

13.08.2012, 14:53. Просмотров 1000. Ответов 6
Метки нет (Все метки)

Предположим, что я делаю шаблонную функцию для простого сложения. Если мне посылаются int и double, я просто складываю не акцентируя внимание на округлении. Если же мне посылается в функцию структура point (в которой три поля) и vector (в котором так же три поля, но это уже другая структура, а не "задефайненная" point), то как я могу сложить отдельно их поля по порядку их объявления? Пытался адресной арифметикой сделать, передавая в функцию ещё кол-во полей, но не вышло :< То ли я глупый, то ли так нельзя
p.s Тип полей в одной структуре одинаков, т.е, если point.x - int, то и остальные два поля тоже int
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2012, 14:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Получения количества полей класса (C++):

Реализовать подсчет количества объектов класса, используя статическую переменную-член класса - C++
как реализовать подсчет количества объектов класса (используя статическую переменную-член класса), а также статическую функцию, которая...

Получение минимального количества операций, необходимых для получения числа - C++
Срочно нужна прога. Может кто то что знает. Сложно будет объяснить, но попробую. короче, мы вводим два числа - количество значений,...

Ошибка получения переменной класса - C++
Есть 2 класса: Класс 1: #include &lt;iostream&gt; #include &quot;MyClass2.h&quot; class MyClass { public:

Получения доступа к переменной другого класса - C++
Нужно получить доступ к переменным x и y класса Field из класса Snake. Как это сделать? // &quot;Змейка V0.1&quot; #include &lt;iostream&gt; ...

Начальные значения полей класса - C++
Приветствую всех. Такой вопрос: какие начальные значения принимают поля класса при создании экземпляра этого класса, если не определен...

Сортировка по одному из полей класса - C++
Всем привет. Я сделал вот такой список. Вопрос как мне его отсортировать, к примеру, по Id и по Name? #include &lt;iostream&gt; #include...

6
Пaтрик
416 / 391 / 39
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
13.08.2012, 14:59 #2
Сделать перегрузку функций. В случае если объект структуры point будет приводится к int, функция должна возвращать сумму полей.
0
John Prick
804 / 737 / 145
Регистрация: 27.07.2012
Сообщений: 2,108
Завершенные тесты: 3
13.08.2012, 15:03 #3
Если я всё правильно понял, то вам нужно просто специализировать шаблонную функцию для ваших классов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class T>
T sum(T t1, T t2)
{
    return t1 + t2;
}
template <>
Point sum(Point p1, Point p2)
{
   Point temp;
   temp.x = p1.x + p2.x;
   temp.y = p1.y + p2.y;
   temp.z = p1.z + p2.z;
   return temp;
}
Ну или же переопределить оператор + для класса Point, тогда никаких специализаций функции sum не потребуется.
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
13.08.2012, 15:18  [ТС] #4
John Prick, не совсем так. Меня интересует именно тот случай, когда я не знаю названия полей.
Т.е код :
C++
1
2
3
4
5
6
7
8
template <typename T1, typename T2>
void Sum(T1& a, const T2& b, const int n)
{
a.field1 += b.field1;
a.field2 += b.field2;
...
a.fieldN += b.fieldN;
}
где n - кол-во полей в структуре (как я уже говорил, у них одинаковое кол-во полей) (как вариант - получать n в самой функции каким-то способом int n = fieldCount(T1); )
на работу с типами для += можно не обращать внимания, ибо "всё хорошо" (с)
0
John Prick
804 / 737 / 145
Регистрация: 27.07.2012
Сообщений: 2,108
Завершенные тесты: 3
13.08.2012, 15:21 #5
опечатался в предыдущем сообщении:
C++
1
2
3
4
5
template <>
Point sum<Point>(Point p1, Point p2)
{
// ...
}
Вот так специализация функции пишется.

Добавлено через 1 минуту
Цитата Сообщение от nexen Посмотреть сообщение
Меня интересует именно тот случай, когда я не знаю названия полей.
Так названия не знаешь или их количество?
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
13.08.2012, 15:29  [ТС] #6
John Prick, ТТ. Я уже сам себя запутал. Извините.
Названия полей не знаю. Нужно как-то перемещаться по полям экземпляра без знания названий.
и, "как бонус", было бы хорошо узнать, можно ли узнать кол-во полей структуры с разными типами полей? (к перемещению это не относится. перемещаюсь я по однотипной стуктуре)
0
John Prick
804 / 737 / 145
Регистрация: 27.07.2012
Сообщений: 2,108
Завершенные тесты: 3
13.08.2012, 16:40 #7
Названия полей не знаю. Нужно как-то перемещаться по полям экземпляра без знания названий.
Ну тут так сходу решения и не придумать. Либо какой-то хитрый шаблон делать, который ещё на этапе компиляции вычисляет количество полей, либо в структуру добавлять ещё поле, отвечающее за количество полей. Надеяться на распределение полей в памяти, наверное, плохо (ну т.е. делать предположения, что все они лежат подряд друг за другом, брать указатель на структуру, приводить его к типу поля и последовательно проходить таким образом структуру, инкрементируя этот указатель), да и наврядли что получится.

Цитата Сообщение от nexen Посмотреть сообщение
было бы хорошо узнать, можно ли узнать кол-во полей структуры с разными типами полей?
Тут ещё мудрее. Наверное, опять же можно попробовать придумать какой-нибудь шаблон, вычисляющий число полей на этапе компиляции, например, используя sizeof(). Сейчас сходу я такой придумать не смогу.

Добавлено через 11 минут
Хотя, вспоминая Александреску, можно попробовать применить списки типов. Тут дело обстоит примерно так: создаём нужный нам набор из типов
C++
1
typedef TYPELIST_3(int, double, char) MyTypes;
Далее создаём простой шаблонный класс:
C++
1
2
3
4
5
template <class T>
struct Holder
{
    T value;
}
Затем генерируем класс, который будет наследовать от этого шаблона, подставляя ему типы из списка типов. У Александреску такой шаблонны класс называется GenScatterHierarchy:
C++
1
typedef GenScatterHierarchy<MyTypes, Holder> MyStruct;
В результате получим структуру, в которой будет 3 поля, по одному на каждый из типов в списке, т.е. аналогично тому, если бы мы написали:
C++
1
struct MyStruct: public Holder<int>, Holder<double>, Holder<char> {};
только с той лишь разницей, что количество полей (т.е. количество типов в списке типов) можно вычислить в общем виде:
C++
1
int fieldsNumber = Length<MyTypes>::Value;
"Просто", не правда ли.
В общем, то, что вы хотите сделать - в принципе реально, но это уже высший С++ пилотаж. Советую почитать книгу Александреску, главу про списки типов. С первого раза ничерта не понять, но может быть натолкнёт на какие-то мысли.
1
13.08.2012, 16:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2012, 16:40
Привет! Вот еще темы с ответами:

Доступ к значениям полей класса - C++
вот есть такой класс class book { private: String name; float page; float price; ...

Вывод полей класса после сравнения - C++
Проблема: (Нужно отыскать нужный фильм и вывести данные об нем.) Если еще конкретнее, то почему после успешного сравнения некорректно...

Два класса, ошибка из-за приватности полей - C++
В двух словх... Первый класс - координата (широта или долгота), второй класс - корабль, у которого есть номер и координаты. Компилятор...

В чем разница в задании полей класса? - C++
Доброго времени! Вопрос: В чем состоит разница между описанием полей класса? Как повлияет на создание объекта в памяти? пример 1 ...


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

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

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