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

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

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

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

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

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

работа с классами - C++
прошу помощи с лабой, вообще вкурить немогу что и как делать:\ Комплексное число, задаваемое своей вещественной и мнимой...

Работа с классами - C++
Программа работает некорректно... не выводит студентов введенных с клавиатуры.... :( выводит только и сравнивает только этих: ...

Работа с классами - C++
Здравствуйте! Вот у меня есть класс Team team.h#pragma once #include &lt;string&gt; using namespace std; class Team{ public: ...

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,013
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
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,013
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
2923 / 1352 / 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);
}
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++
Есть такой код: CMainWindow MainWindow; CUITextView textTest; textTest.SetText(&quot;Text View Test&quot;); ...

Работа с классами - C++
Задача:найти сумму всех отрицательных элементов матрицы и записать в вектор. For (i=0;i&lt;=N;i++) for (j=0;j&lt;=M;j++) if (a&lt;0) ...

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

Работа с классами в С++ - C++
Доброго всем дня.У меня возникла проблема с освоением языка C++ , сейчас пишу курсовую на этом языке, и ещё не совсем всё понимаю, но книги...


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

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

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

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