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

Union - Объединения - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Погрешность вычисления(ряд Тейлора) http://www.cyberforum.ru/cpp-beginners/thread655686.html
написал программку вычисления функции exp(x) разложением в ряд Тейлора с заданной точностью. Программа должна суммировать члены ряда до тех пор, пока модуль очередного члена ряда не станет меньше точности. только чего-то я сделал не так и получился какой-то ужас (опыт в С++ 2 недели ). При x>4 начинает нести бред. Для отрицательных значений не делал еще. Ну там просто. Короче вот код: #include...
C++ Написать конвертер, переводящий л.с. в ньютон на метр переводящий л.с в ньютон на метр http://www.cyberforum.ru/cpp-beginners/thread655679.html
Сортировка методом центрированных вставок C++
Доброго времени суток. Помоги доделать программу. Я решил сделать эту сортировку через массивы(возможно зря)). И теперь, допусти если у нас элемент их исходного массива imas больше чем последний из второго массива vmas, то сдвинуть все элементы второго массивы на 1 назад, освободив место для нового элемента. + Нужно еще чтобы элемент сравнивался не только со средним элементом vmas, но и если...
C++ Масштабирование числовой прямой
Незнаю куда запостить такой вопрос, поэтому в случае чего перенесите Имеется шкала(допустим от 0 до 88) как ее перевести в другую (допустим от нуля до 12) и как перевести шкалу от n до m к шкале от 0 до 1
C++ не могу понять что с выводом http://www.cyberforum.ru/cpp-beginners/thread655619.html
помогите найти косяк,у меня при отрицательном "a" он выдаёт результат и "error" хотя должен только "error" таже проблема если b=0 a>0 #include <stdafx.h> #include <iostream> using namespace std; int main() { double a,b; cout<<"VVedite a and b";
C++ Динамический двумерный массив: найти наибольший из нименьших элементов строк здравствуйте! пишу первый раз, не знаю точно, к С или С++ относится вопрос (п.ч. там нет объектов), я учусь на 2 курсе, нам задали написать программу, в которой можно вводить двумерный массив, меню из 4 пунктов, в пункте "обработка" программа находит наименьший эл-т в каждой строке, затем находит среди них наибольший и выводит на экран его, номер его строки и столбца. я заметил, что если вводить... подробнее

Показать сообщение отдельно
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
21.09.2012, 21:16     Union - Объединения
Окей, суть в чём: юнион позволяет хранить несколько величин (в данном случае величины типов нормальный-элемент-множества и множество-как-элемент-множества) в одном куске памяти. То есть одну и ту же переменную юнион-типа можно трактовать и как один из хранимых типов, и как другой.

Применительно к данному случаю юнион тут как собаке пятая лапа, но раз уж сказано. (Вообще стоит делать внутри несколько контейнеров "для нормальных", "для множеств", "для другой-третий-тип".)

Идею вы поняли правильно (шаблонами не гружу):
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
struct SetElement {
  enum { ATOM, SET } type; // токен типа, содержащий тип текущих хранимых данных
  
  // Собсно данные: или атом, или множество. Фишка в том, что можно хранить или
  // множество, или атом. Если достать что-то другое, то получим мусор и вообще капец.
  // Всё из-за того, что хранятся они в одном и том же месте памяти.
  //
  // Хранить сразу значения или указатели на них, решайте сами, тут однозначно не скажешь.
  union {
    char atom;
    Set set;
  };
 
  SetElement(char value)
  {
    atom = value;
    type = ATOM;
  }
 
  SetElement(const Set &value)
  {
    set = value;
    type = SET;
  }
 
  SetElement& operator=(char value)
  {
    atom = value;
    type = ATOM;
    return *this;
  }
 
  SetElement& operator=(const Set &value)
  {
    set = value;
    type = SET;
    return *this;
  }
 
  bool operator==(const SetElement &other)
  {
    if (this->type != other.type) {
      return false;
    }
    else {
      if (this->type == ATOM) {
        return this->atom == other.atom;
      }
      else {
        return this->set == other.set;
      }
    }
  }
};
В итоге можно делать вот так:
C++
1
2
3
4
5
6
SetElement element1('x'); // элемент-атом
SetElement element2(someSet); // элемент-множество
if (element1.type == SetElement::ATOM) { // можно сделать методы isAtom() и isSet()
  std::cout << element1.atom;
}
element1 = element2; // element1 теперь тоже элемент-множество
К сожалению, придётся руками смотреть на тайп-токен, чтобы понять, какого типа этот элемент, и как его доставать: через .atom или через .set. В принципе, можно добавить сверху методы asAtom() и asSet(), которые будут ругаться, если типы не совпадают, и спрятать все эти поля внутрь, но это уж как хотите.
 
Текущее время: 17:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru