Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перезагрузка операций 
:(
    Опции темы
flyleaf
Дата 17.4.2009, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 40
Регистрация: 6.4.2009

Репутация: нет
Всего: нет



Помогите пожалуйста с перезагрузкой операций
Задание состоит в следующем: Есть класс в котором задано множество типа char; нужно перезагрузить операции 
"-" - удалить елемент из множества (типо set-char)
"*" - пересечение множеств
"<" - сравнение множеств 

больше етого у меня ничего пока не получается((
Код

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int size=5;
class atd
{ char * m;
    int r;
         public:
               atd()
        {m=new char[size];
        r=0;
            }
        atd(const atd& ob);
        atd &operator-(char ch,atd &ob);
        atd &operator*(atd &ob);
        atd &operator<(atd &ob);
    };

  atd &operator-(char ch,atd &ob)
  {
      atd temp;
      int i,j;
      temp.m=m;
      temp.r=r;
      i=strlen(temp.m);
      for(j=0;j<i;j++)
      if (temp[j]==ch)......
      }
int main()
{

    return 0;
}


Это сообщение отредактировал(а) flyleaf - 17.4.2009, 11:29
PM MAIL ICQ   Вверх
azesmcar
Дата 17.4.2009, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



flyleaf

эти операторы определяются так.
Код

class atd
{
public:
    atd& operator = (const atd& rhs);
    atd& operator + (const atd& rhs);
    atd& operator - (const atd& rhs);
    atd& operator * (const atd& rhs);
    atd& operator / (const atd& rhs);
    atd& operator < (const atd& rhs);
    atd& operator > (const atd& rhs);

   atd& operator + (char c);
   atd& operator - (char c);
   atd& operator * (char c);
   atd& operator / (char c);
   atd& operator < (char c);
   atd& operator > (char c);

};


Это сообщение отредактировал(а) azesmcar - 17.4.2009, 11:36
PM   Вверх
flyleaf
Дата 17.4.2009, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 40
Регистрация: 6.4.2009

Репутация: нет
Всего: нет



azesmcar, спасибо, учту) Но у меня больше проблема с организацией перезагрузки операторов, а не с обьявлением(
PM MAIL ICQ   Вверх
azesmcar
Дата 17.4.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата

azesmcar, спасибо, учту) Но у меня больше проблема с организацией перезагрузки операторов, а не с обьявлением( 

ну с обьявлением проблема была однозначно smile
а поконкретней можно узнать в чем задача и в чем проблема?
PM   Вверх
zim22
Дата 17.4.2009, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



вместо operator < я реализовал operator==. Как по мне, это более логично для сравнения множеств.
Код

#include <set>
#include <algorithm>

class Adt {
public:
  friend bool operator==(const Adt &lhs, const Adt &rhs);
  
  explicit Adt() : size(0) { }  
  explicit Adt(size_t sz) : size(sz) { Init(); }
  void insert(char value) { set.insert(value); }

  Adt &operator-=(const char &value) {
    if (set.count(value)) {
      set.erase(value);
    }
    return *this;    
  }
  Adt &operator +=(const Adt &rhs) {
    if (&rhs == this) return *this;

    std::set<int> temp_set;
    std::set_intersection(set.begin(), set.end(), 
      rhs.set.begin(), rhs.set.end(), 
      inserter(temp_set, temp_set.begin()));
    set.clear();
    set.insert(temp_set.begin(), temp_set.end());
    return *this;
  }
private:
  std::set<char> set; 
  size_t size;  

  void Init() {
    std::generate_n(inserter(set, set.begin()), size, rand);
  }
};

Adt operator-(Adt &lhs, char rhs) {
  Adt ret(lhs);
  ret -= rhs;
  return ret;
}

Adt operator+(const Adt &lhs, const Adt &rhs) {
  Adt ret(lhs);
  ret += rhs;
  return ret;
}

bool operator==(const Adt &lhs, const Adt &rhs) {
  return (lhs.set == rhs.set);
}
bool operator!=(const Adt &lhs, const Adt &rhs) {
  return !(lhs == rhs);
}
int main()
{ 
  //Adt a(10), b(5);
  Adt a, b;
  a.insert('a');
  a.insert('b');
  a.insert('c');

  a -= 'a';
  b.insert('b');
  b.insert('d');
  a = a + b;

  if (a == b) {
    a = a - 'c';
  }

  //a += b;
  

  //a -= '#';
  //a = a - '#';
  //a += b;


  return 0;
}


Это сообщение отредактировал(а) zim22 - 17.4.2009, 12:01


--------------------
PM MAIL   Вверх
flyleaf
Дата 17.4.2009, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 40
Регистрация: 6.4.2009

Репутация: нет
Всего: нет



zim22, Спасибо за етот пример, для себя лично  его буду разбирать и пытатся все там понять. для сравнения я б и сама взяла оператор ==, но к сожалению преподователя не перепрешь, ей нужно >. и суть еще в тот что std та и вообще библиотеку algorithm мы как бы не проходили, и ответить на КУЧУ ее вопросов я скорее не смогу, хотя можно и постаратся.... . =(

azesmcar, насчет обьявления, так я его украла у Шилдта) а поконкретней задача состоит в том что у меня не получается заставить "+" добавлять новый елемент, хотя если посидеть - получится. мне больше непонятно с пересечением множеств и сравнением, что оно должно возвращать и как его вообще организовать(
PM MAIL ICQ   Вверх
bsa
Дата 17.4.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



flyleaf, если ты объявляешь метод в классе, то при опеределении (написании тела), необходимо указывать имя класса перед именем метода, отделяя двумя двоеточиями:
Код
class MyClass
{
...
    bool operator<(const MyClass &c) const;
...
};

bool MyClass::operator<(const MyClass &c) const
{
...
}
Некоторые операторы рекомендуется перегружать отдельно от класса (все, кроме присваивающих (=, +=, -=, *=...)) - позволит пользоваться неявным приведением типа. В этом случае нужно написать оператор (вне тела класса) с указанием двух аргументов, но уже без указания имени класса:
Код
bool operator<(const MyClass &c1, const MyClass &c2);


Это сообщение отредактировал(а) bsa - 17.4.2009, 12:25
PM   Вверх
J0ker
Дата 17.4.2009, 16:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(flyleaf @  17.4.2009,  11:21 Найти цитируемый пост)
Помогите пожалуйста с перезагрузкой операций

matrix reloaded  smile

Это сообщение отредактировал(а) J0ker - 17.4.2009, 16:33


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0695 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.