C++ перегрузка оператора “+” и метод push

276
18 января 2018, 21:02

Всем привет. Я изучаю классы и перегрузки операций в С++. В общем дали мне тут задание создать некое подобие из STL библиотеки контейнер set. Он у меня сделан, но не совсем правильно работает метод push и перегрузка операции "+". То есть к примеру X + Y. Я закидываю во временный массив Х потом У и после этого я должен их отсортировать и вызвать метод удаления уникальных элементов. Но прежде чем это реализовать, хотелось бы разобраться в чем причина не работы метода push и перегрузки "+". При сложении у меня выдается ошибка, а при использовании push выводится только первая буква. Я думал использовать string или vector'а но потом решил все такие остановится на том что я сделал. Заранее благодарю.

Вот мой код:

    #include <iostream>
    #include <vector>
    using namespace std;
   class Set
   {
       private:
          char *num;size_t size;
       public:
          int min();
          void sort();
          void unique();
          bool find();
          Set(){}
          Set(char *str)
          {
              size = strlen(str);
              num = new char[size];
              for(int i=0; i<size; i++)
              {
                  num[i] = str[i];
              }
              //sort();
              //unique();
          }
          const Set& push(char *str)
          {
             char *temp = new char[size+strlen(str)];
             for(int i=0; i<size; i++)
             {
                  temp[i] = num[i];
             }
             temp[size] = *str;
             delete [] num;
             this->num = temp;
             this->size += strlen(str);
             return *this;
          }
          const Set operator+(const Set& s)
          {
             if(this->size != s.size)
             {
                 return NULL;
             }
             Set v;
             size = v.size + size;
             for(int i=0; i<size; i++)
             {
                 v.num[i] = num[i] + s.num[i];
             }
             return v;
          }
          friend const ostream& operator<<(ostream& os, const Set& s);
    };
const ostream& operator<<(ostream& os, const Set& s)
{
    for(int i=0; i<s.size; i++)
    {
        os << s.num[i];
    }
    return os;
}
int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "Hello, World!\n";
    char s[25] = "Hello world ";
    Set ss(s);
    char q[25] = "Hola\n";
    ss.push(q);
    Set sw(q);
    ss = ss + sw;
    cout << ss;
    return 0;
}
Answer 1

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

Ну так вы в push как раз и копируете только первую букву

         for(int i=0; i<size; i++)
         {
              temp[i] = num[i];
         }
         temp[size] = *str;

содержимое num[] вы копируете в temp[] целиком - при помощи цикла. А куда девался цикл для str? Почему вы для str не написали такого же цикла?

Вот это

         temp[size] = *str;

это копирование только первой буквы.

Answer 2

строчка за строчкой:

 const Set operator+(const Set& s)
          {
             if(this->size != s.size)
             {
                 return NULL;
             }

во первых возвращая const Set вы сами создаете неудобство для пользователья. Возвращайте просто Set. Во вторых вы вместо Set возвращаете Null, если размеры множеств не равны?.. и что это означает?... У вас в main() размеры множеств, которые вы суммируете, не равны... пойдем дальше:

 Set v;
   size = v.size + size;
   for(int i=0; i<size; i++)
       {
         v.num[i] = num[i] + s.num[i];
       }

вы определили конструктор по умолчанию с пустым телом, потому у вашего обьекта v данные неинициализированы, но вы его используете, а потом возвращаете, так что у вас ошибка не одна. И потом один маленький совет не по вопросу: старайтесь меньше использовать постинкремент (i++ каждый раз создает временный обьект), особенно в циклах...

Answer 3

То, что тут за класс set не подходит к описанию контейнера set а подходит к описанию vector.

http://ru.cppreference.com/w/cpp/container/set Поиск, удаление и вставка операции имеют логарифмическую сложность. Наборы обычно реализуется как красно-черные деревья.

Действия над вектором как над множеством можно сделать через:

#include <algorithm>

А это неправильно:

Set(){}

должно быть:

Set(){num=nullptr;}
Answer 4

В общем я тут вот так вот исправил и все заработало. Возможно есть варианты это улучшить буду рад если поделитесь.

     const Set& push(char *str)
     {
        char *temp = new char[size+strlen(str)+1];
        //char sum;
//        for(int i=0; i<size; i++)
//        {
//            temp[i] = num[i];
//            //sum += str[i];
//            temp[i] = str[i];
//        }
        strcat(temp, num);
        strcat(temp, str);
        //puts(temp);
        //temp[size] = sum;
        delete [] num;
        this->num = temp;
        this->size += strlen(str);
        return *this;
    }
READ ALSO
Отслеживание нажатия клавиш на Mac

Отслеживание нажатия клавиш на Mac

Мне нужно отследить нажатие клавиши F4 на OSX и выполнить действие, пишу на С++, желательно код обьяснить и без зависимостей

293
Как спарсить CSV file in java

Как спарсить CSV file in java

Вот пожалуйста написал код для разбора CSV файлов вашего типа стандартными методами java:

421
Не работает класс на андроид 4.4.х

Не работает класс на андроид 4.4.х

Столкнулся с проблемой в работоспособности кода на ранних версиях андроидаНа устройстве с ОС 7

344