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

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

Войти
Регистрация
Восстановить пароль
 
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
#1

Нетривиальная работа с классами - C++

11.01.2013, 09:36. Просмотров 363. Ответов 8
Метки нет (Все метки)

Проблема такая , есть классы
C++
1
2
A{ public: int a,int b}
 B { public: int c,int d}
Как мне считать в эти классы одной функцией
template <class T> read(*T) {T->первое поле класса =x, T->второе поле класса = y};
Вот я знаю что могу вернуть имя класса через typeid(B).name() , но вот имя поля ?
Если в первом случае первое поле имеет название a , а во втором c?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2013, 09:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нетривиальная работа с классами (C++):

Работа с классами - C++
плиз помогите решить нужно написать функции которыи будут выполнять сложение, вычитание, умножение и деление допустим d1 и d3 вот то...

Работа с классами - C++
Помогите с задачей, пожалуйста! Условие на фотографии: Перепечатывайте задание на форум.

работа с классами - C++
помогите пожалуйста написать программу на C++: Создать класс Complex для работы с комплексными числами,который должен содержать два...

Работа с классами - C++
Помогите пожалуйста написать программу. Задан массив действительных чисел. Найти количество элементов, значение которых меньше...

Работа с классами - C++
Помогите плз Определите значение переменных а, х, с после выполнения следующих команд: class First { int value; public: ...

Работа с классами - C++
Наверно классическая задачка для тех, кто только начинает изучать классы. Есть группы и студенты. Проблема в том, что до меня не доходит,...

8
0x10
2478 / 1651 / 247
Регистрация: 24.11.2012
Сообщений: 4,087
11.01.2013, 10:07 #2
Лучше не греть голову, пытаясь решить напрямую. Вычисление адреса поля по смещению не будет универсальным решением.
Как вариант, можно сделать промежуточный класс, объекты которого будут хранить ссылки на поля твоих классов.
0
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
11.01.2013, 10:07  [ТС] #3
Скажем просто для примера даже так - не получиться

C++
1
2
3
4
5
6
7
8
template <class T> load(T *lop)
{
if (typeid(T).name()=="A")
{
lop->a=1;
}
 
}
0
0x10
2478 / 1651 / 247
Регистрация: 24.11.2012
Сообщений: 4,087
11.01.2013, 10:32 #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
#include <iostream>
 
template<class T, class U>
class FieldAdapter
{
public:
   FieldAdapter(T& first, U& second) :
      first_(first),
      second_(second) { }
 
   T& first_;
   U& second_;
};
 
template<class T, class U>
void Init(const FieldAdapter<T, U>& fa, const T& x, const U& y)
{
   fa.first_ = x;
   fa.second_ = y;
}
 
struct A
{
   int a;
   double b;
};
 
struct B
{
   int c;
   int d;
};
 
int main()
{
   A obj1;
   B obj2;
   
   Init(FieldAdapter<int, double>(obj1.a, obj1.b), 1, 2.0);
   Init(FieldAdapter<int, int>(obj2.c, obj2.d), 3, 4);
   
   std::cout << "A: " << obj1.a << " " << obj1.b << std::endl;
   std::cout << "B: " << obj2.c << " " << obj2.d << std::endl;
   
   return 0;
}
0
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
11.01.2013, 10:36  [ТС] #5
можно сделать так
C++
1
2
3
4
5
6
7
8
template <class t> t* read(t *T)
{
struct hack{int _x,_y;} *target=reinterpret_cast<hack*> (T);;
 
target->_x = x;
target->_y = y;
return T;
}
но ведь это ненормально
0
_Alexander
12 / 12 / 1
Регистрация: 05.11.2012
Сообщений: 49
11.01.2013, 10:40 #6
Можно через дружеские функции)
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
11.01.2013, 13:24 #7
Цитата Сообщение от Andreyasu Посмотреть сообщение
Проблема такая , есть классы
C++
1
2
A{ public: int a,int b}
 B { public: int c,int d}
Как мне считать в эти классы одной функцией
template <class T> read(*T) {T->первое поле класса =x, T->второе поле класса = y};
Вот я знаю что могу вернуть имя класса через typeid(B).name() , но вот имя поля ?
Если в первом случае первое поле имеет название a , а во втором c?
С++ не поддерживает какой-либо приемлемый механизм рефлексии.

Подобные проблемы чаще всего возникают там, где не удалось провести декомпозицию. Таких грязных хаков надо по-возможности избегать. Если вы приведете ваше исходное задание, можно подумать, как это сделать не прибегая к исхищрениям.

Можно сделать через специализацию шаблона, что, впрочем, мало отличается от просто перегруженной функции.
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
class A {
 public:
  int a, b;
};
 
class B {
 public:
  int c, d;
};
 
// реализация по-умолчанию ничего не делает
template <class T>
void read(T &value) {
}
 
// специализированная реализация для класса A
template <>
void read<A>(A &value) {
  value.a = value.b = 10;
}
 
// специализированная реализация для класса B
template <>
void read<B>(B &value) {
  value.c = value.d = 11;
}
 
int main(int argc, char *argv[]) {
  A a;
  B b;
  
  read(a);
  read(b);
}
0
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
11.01.2013, 14:04  [ТС] #8
задача состоит в создание системы сериализаци произвольного класса НЕ использую стандартный boost/serialization/ , а создав свой метод. Первое что нужно это именно произвольный досуп ко всей информации в структуре произвольного типа.

То есть то что я здесь спрашиваю нужно для десериализаци объекта.
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
11.01.2013, 19:44 #9
В С++ нет прямой возможности перечислить свойства класса.

Поэтому тот же boost:serialization заставляет использовать дружественные функции boost::access и serialize, в которых перечисляются все сериализуемые свойства класса. Копайте в этом же направлении.
0
11.01.2013, 19:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2013, 19:44
Привет! Вот еще темы с ответами:

Работа с классами - C++
Ввести прямоугольную матрицу. Элементами матрицы являются символы. Пользователь может переставлять два любых символа в матрице, задавая...

Работа с классами - C++
Привет всем!!!!! Пацаны помогите написать программу плиз, на завтро нужно!!!!! Тема: Классы Задание:Описати інтерфейс та реалізувати...

Работа с классами. - C++
Или это задача такая лёгкая (на экзамене будет), или я чего-то не понимаю. В классе Pair может содержаться только 2 числа (ну и 2 метода не...

Работа с классами - C++
Привет!!! Есть задачка: &quot;Определите класс Oper, содержащий идентификатор типа ld (string или C-строка) и операцию (указатель на...


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

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

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