Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
11.01.2013, 09:36     Нетривиальная работа с классами #1
Проблема такая , есть классы
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?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2013, 09:36     Нетривиальная работа с классами
Посмотрите здесь:

C++ Работа с классами
работа с классами C++
Работа с классами C++
C++ Работа с классами.
работа с классами в С++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
11.01.2013, 10:07     Нетривиальная работа с классами #2
Лучше не греть голову, пытаясь решить напрямую. Вычисление адреса поля по смещению не будет универсальным решением.
Как вариант, можно сделать промежуточный класс, объекты которого будут хранить ссылки на поля твоих классов.
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;
}
 
}
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
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;
}
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;
}
но ведь это ненормально
_Alexander
12 / 12 / 1
Регистрация: 05.11.2012
Сообщений: 49
11.01.2013, 10:40     Нетривиальная работа с классами #6
Можно через дружеские функции)
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
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);
}
Andreyasu
2 / 2 / 0
Регистрация: 02.07.2009
Сообщений: 52
11.01.2013, 14:04  [ТС]     Нетривиальная работа с классами #8
задача состоит в создание системы сериализаци произвольного класса НЕ использую стандартный boost/serialization/ , а создав свой метод. Первое что нужно это именно произвольный досуп ко всей информации в структуре произвольного типа.

То есть то что я здесь спрашиваю нужно для десериализаци объекта.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2013, 19:44     Нетривиальная работа с классами
Еще ссылки по теме:

C++ Работа с классами
Работа с классами C++
Работа С Классами C++

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

Или воспользуйтесь поиском по форуму:
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
11.01.2013, 19:44     Нетривиальная работа с классами #9
В С++ нет прямой возможности перечислить свойства класса.

Поэтому тот же boost:serialization заставляет использовать дружественные функции boost::access и serialize, в которых перечисляются все сериализуемые свойства класса. Копайте в этом же направлении.
Yandex
Объявления
11.01.2013, 19:44     Нетривиальная работа с классами
Ответ Создать тему
Опции темы

Текущее время: 03:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru