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

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

Войти
Регистрация
Восстановить пароль
 
Викдон
67 / 67 / 4
Регистрация: 21.11.2008
Сообщений: 226
#1

Классы - C++

25.02.2009, 21:01. Просмотров 728. Ответов 9
Метки нет (Все метки)

вот есть класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Mnojestvo{   //Класс Множество
 public:
     Mnojestvo(int n,char*ptr); 
     ~Mnojestvo(){delete FMas;};
     Mnojestvo Union(Mnojestvo &P) const; //Метод "Объединение"
     Mnojestvo Cross(Mnojestvo &P) const;// Метод "Пересечение"
     void Insert_Elem(char elem) ; //Метод "Добавление элемента
     void View_Set(); //Получение значения множества
     Mnojestvo operator + (Mnojestvo &P); //Пререгрузка операции "+"
     Mnojestvo operator - (Mnojestvo &P); //Перегрузка операции "-"
     int Proverka(char elem); //Проверка элемента на вхождение в множество
   // методы
 private:
    char*FMas; //Указатель на массив символов
    int count; //Число элементов в множестве
};
конструктор:
C++
1
2
3
4
5
6
Mnojestvo::Mnojestvo(int n,char*ptr){ //Конструктор
   FMas=new char[n];
     for(int i=0;i<n;i++)
        FMas[i]=ptr[i];
     count=n;
 }
реализация метода 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
Mnojestvo Mnojestvo::Union(Mnojestvo &P) const{ 
     
     char UnionMas [20]; //Массив "объединения"
     char elem;
     int counter=count;
     bool flag;
      
       for(int i=0;i<count;i++){   //Заполняем массив объединения множеством текущего объекта
          UnionMas[i]=FMas[i];
       }
 
      // Заносив в массив "Объединения" только те элементы мн-ва входного объекта которых нет в массиве "объединение"
       for(int j=0;j<P.count;j++){  //Проходим по множеству входного объекта
         elem=P.FMas[j];
         flag=false;
          for(int k=0;k<count;k++){  //Бегаем по this множеству
              if (elem==FMas[k])
                  flag=true;
          }
        if (flag==false){
            UnionMas[counter]=elem;
            counter++;
        }
       
      }//for
  
       Mnojestvo Time(counter,UnionMas); //Создаем Временный объект
       
       
 
    return Time ;
 }
А вот вызов метода Union в Main:

C++
1
C=A.Union(B);
В методе Union я возвращаю объект Time и хочу присвоить объекту этого же класса C, НО до присвоения вызывается деструктор и удаляет Time.....Можно ли как то возвратить Time не используя его как входной параметр в методе Union?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2009, 21:01     Классы
Посмотрите здесь:

классы C++
C++ Классы
C++ классы
Классы C++
C++ Классы
Классы в си++ C++
классы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2890 / 1239 / 78
Регистрация: 27.05.2008
Сообщений: 3,325
25.02.2009, 21:35     Классы #2
Ты делаешь все правильно, и вернуть Time можно, но! проблема в том, что в твоем классе отсутствует конструктор копирования. Добавь его, и приведенный код заработает.
Также стоит добавить operatoir=(). Ну и исправить деструктор класса (а он содержит ошибку!).
Викдон
67 / 67 / 4
Регистрация: 21.11.2008
Сообщений: 226
25.02.2009, 22:17  [ТС]     Классы #3
ну вот
C++
1
2
3
4
5
6
//Конструктор копирования
Mnojestvo::Mnojestvo(Mnojestvo &rN){
    count=rN.count;
    for(int i=0;i<rN.count;i++)
        FMas[i]=rN.FMas[i];
}
а как в реализовать перегрузку "=" что бы вызов был таким C=A.Union(B);

да! и что за ошибка в деструкторе?
CheshireCat
Эксперт С++
2890 / 1239 / 78
Регистрация: 27.05.2008
Сообщений: 3,325
25.02.2009, 22:58     Классы #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
//Конструктор копирования
 
Mnojestvo::Mnojestvo(const Mnojestvo &rN){
    FMas = new char[rN.count];
    assert(FMas); 
    if (!FMas)
        throw std::runtime_error("Not enough memory!");
    for(int i=0;i<rN.count;i++)
        FMas[i]=rN.FMas[i];
    count=rN.count;
}
 
Mnojestvo& Mnojestvo::operator=(const Mnojestvo &rN){
    if (this == &rN)
        return *this;
 
    char* temp = new char[rN.count];
    assert(temp); 
    if (!temp)
        throw std::runtime_error("Not enough memory!");
    for(int i=0;i<rN.count;i++)
         temp[i]=rN.FMas[i];
    delete[] FMas; 
    FMas = temp;
     count=rN.count;
 
    return *this;
}
Ну и в деструкторе, конечно, delete [] FMas;
Викдон
67 / 67 / 4
Регистрация: 21.11.2008
Сообщений: 226
04.03.2009, 12:05  [ТС]     Классы #5
При орерации "= "над объектами вызывается конструктор копирования. А почему в
C=A.Union(B); Конструктор копирования определенный мной не вызывается?
CheshireCat
Эксперт С++
2890 / 1239 / 78
Регистрация: 27.05.2008
Сообщений: 3,325
04.03.2009, 12:45     Классы #6
А с какой стати он должен вызываться? Вызываться должен, судя по всему, operator=(). Но все же лучше всего приведи код, иллюстрирующий проблему.
Викдон
67 / 67 / 4
Регистрация: 21.11.2008
Сообщений: 226
04.03.2009, 12:55  [ТС]     Классы #7
Ой забыл написать, если не использовать operator = , то по идее должен вызваться конструктор копирования
C++
1
2
3
4
5
6
7
Mnojestvo::Mnojestvo(const Mnojestvo &rN){
    cout<<"\n copy constructor";
    FMas= new char [rN.count];
    count=rN.count;
    for(int i=0;i<rN.count;i++)
        FMas[i]=rN.FMas[i];
}
но он не вызывается)


в простом случае :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MyClass{
public:
    MyClass(){cout<<"Standart constructor \n"; itsAge=4;};
    
    MyClass(MyClass&) {cout<<"Copy constructor \n";};
    ~MyClass(){};
private:
    int itsAge;
 
};
 
 
int _tmain(int argc, _TCHAR* argv[])
{ 
 
    MyClass Frisky;
    MyClass Boots=Frisky;
    return 0;
}
MyClass Boots=Frisky;--Вызывается конструктор копирования

А в проге которая выше при C=A.Union(B); конструктор копир. не вызывается)) по крайне мере определенный мной)
CheshireCat
Эксперт С++
2890 / 1239 / 78
Регистрация: 27.05.2008
Сообщений: 3,325
04.03.2009, 13:12     Классы #8
Цитата Сообщение от Викдон Посмотреть сообщение
Ой забыл написать, если не использовать operator = , то по идее должен вызваться конструктор копирования [.......]
MyClass Boots=Frisky;--Вызывается конструктор копирования
А в проге которая выше при C=A.Union(B); конструктор копир. не вызывается)) по крайне мере определенный мной)
1. А с какой это стати если не использовать operator =, то должен вызваться конструктор копирования? Почему?
2. Здесь все правильно. MyClass Boots=Frisky; - это НЕ присваивание, это конструирование объекта Boots, поэтому вызывается конструктор копирования. А C=A.Union(B); - это просто присваивание, с какой стати будет вызываться конструктор копирования?
Помедитируй над следующим кодом:
C++
1
2
3
4
    MyClass Frisky;
    MyClass Foo;
    MyClass Boots = Frisky;  // конструирование объекта Boots, не присваивание! Раньше никакого объекта Boots не существовало.
    Foo = Frisky;            // присваивание, не конструирование - Foo уже сконструирован двумя строками раньше! (и существует при исполнении предыдущей строки)
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
04.03.2009, 13:15     Классы #9
так он вызывается при создании объекта
C++
1
Mnojestvo C=A.Union(B);
А у тебя просто присваивание
C++
1
C=A.Union(B);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2009, 13:25     Классы
Еще ссылки по теме:

C++ Классы
Классы C++
C++ Классы С++
Классы в С++ C++

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

Или воспользуйтесь поиском по форуму:
Викдон
67 / 67 / 4
Регистрация: 21.11.2008
Сообщений: 226
04.03.2009, 13:25  [ТС]     Классы #10
а т.е при обычном присваивании оператор присваивания просто копирует значения одого объекта в другой, не используя конст. копирования. Ясно. Спасибо!
Yandex
Объявления
04.03.2009, 13:25     Классы
Ответ Создать тему
Опции темы

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