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

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

Войти
Регистрация
Восстановить пароль
 
Etudiante
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
#1

После объявления деструктора программа перестает выводить данные на экран - C++

17.04.2009, 15:53. Просмотров 611. Ответов 9
Метки нет (Все метки)

Помогите, плиз!
Без деструктора программа работает (правда, компилятор возмущается, что их нет). После того, как я его добавляю, данные на экран больше не выводятся

файл .hh

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
#include <string>
#ifndef _RACINE_HH
#define _RACINE_HH
class Racine {
protected:
  std::string nom, mail;
  int age;
 
public: 
  Racine();
  Racine(const std::string &_nom, const std::string &_mail, int _age); 
  virtual ~Racine(){}; //деструктор
  virtual  void afficher() const; //функция вывода на экран
 
 
  void put_nom(const std::string &n);
  const std::string &get_nom() const;
 
  void put_mail(const std::string &m);
  const std::string &get_mail() const;
 
  void put_age(int a);
  const int get_age() const;
 
 
};
#endif
файл .сс

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
#include <iostream>
#include "Racine.hh"
 
using namespace std;
 
Racine::Racine(const std::string &_nom, const std::string &_mail, int _age)
{nom=_nom; mail=_mail; age=_age;}
 
Racine::Racine()
{}
//Racine::~Racine(){
    //delete &nom;
    //delete &mail;
    //delete &age;
//}
 
void Racine::afficher() const {
cout <<"Nom: "<< get_nom()<<"\n";
    cout <<"Mail: "<< get_mail()<<"\n"; 
    cout <<"Age: "<< get_age()<<"\n";
}
  void Racine::put_nom(const string &n){
    nom = n;
  }
 
  const string &Racine::get_nom()const {
    return nom;
  }
 
 
 
 
  void Racine::put_mail(const std::string &m){
    mail = m;
  }
 
  const string &Racine::get_mail() const{
    return mail;
  }
 
  void Racine::put_age(int a){
    age = a;
  }
 
  const int Racine::get_age() const{
    return age;
  }
подкласс Employe

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
файл .hh
 
#include <string>
#include "Racine.hh"
 
class Employe : public Racine {
  std::string dep, bureau;
  
public: 
  Employe();
  Employe(const std::string &_nom, const std::string &_mail, int _age,
          const std::string &_dep,const std::string &_bureau);
  ~Employe(){};  //деструктор     
 
  void afficher() const;
  void put_dep(const std::string &d);
  const std::string &get_dep() const;
 
  void put_bureau(const std::string &b);
  const std::string &get_bureau() const;
  
};
файл .сс
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
#include <iostream>
#include "Racine.hh"
#include "Employe.hh"
 
 
using namespace std;
 
Employe::Employe()
{}
 
Employe::Employe(const std::string &_nom, const std::string &_mail, int _age,
          const std::string &_dep, const std::string &_bureau):Racine(_nom, _mail, _age)
{dep=_dep;
bureau=_bureau;}
 
//Employe::~Employe(){ //деструктор
    //delete &nom;
    //delete &mail;
    //delete &age;
    //delete &dep;
    //delete &bureau;
//}
 
void Employe::afficher() const { //вывод на экран данныъ об объекте
cout <<"Nom: "<< get_nom()<<"\n";
    cout <<"Mail: "<< get_mail()<<"\n"; 
    cout <<"Age: "<< get_age()<<"\n";
    cout <<"Departement: "<< get_dep()<<"\n";
    cout <<"Bureau: "<< get_bureau()<<"\n";
    cout <<"\n";
    
}
 
  void Employe::put_dep(const string &d){
    dep = d;
  }
 
  const string &Employe::get_dep()const {
    return dep;
  }
 
  void Employe::put_bureau(const string &b){
    bureau = b;
  }
 
  const string &Employe::get_bureau()const {
    return bureau;
  }
сама программка: выводит на экран данные про MonsieurX, работает без деструктора, с деструктором компилятор ошибку не выдает, но на экран не выводится ничего!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using namespace std;
 
int main() {
 
Racine** tab =new Racine*[10]; //подразумевается, что объектов много :)
unsigned int count = 0;
 
tab[count++] = new Employe("MonsieurX", "MonsieurX@xxx.fr", 40, "TSI", "CXX");
 
 for(unsigned int i=0;  i<=count; i++)
 
   tab[i]->afficher(); //вывод на экран (реализация выше)
  
  
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2009, 15:53     После объявления деструктора программа перестает выводить данные на экран
Посмотрите здесь:

C++ Программа перестает компилироваться после подключения библиотеки <Afx.h>
Программа должна считывать английский текст и выводить на экран слова, которые начинаются на гласные буквы C++
C++ Запишите в файл школьную таблицу умножения, после чего выведите данные из файла на экран.
Инициализация массива после объявления C++
C++ Разработать программу, позволяющую вводить данные с клавиатуры и выводить их на экран с простейших форматированием
Разработать программу,позволяющую вводить данные с клавиатуры и выводить их на экран с простейшим форматированием C++
C++ Одна программа записывает данные в файл, а другая их считывает и выводит на экран
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
17.04.2009, 15:57     После объявления деструктора программа перестает выводить данные на экран #2
Тело деструктора в твоем случае должно быть пустым:
C++
1
2
3
Racine::~Racine() 
{
}
darkAngel
Технофашист
214 / 195 / 4
Регистрация: 11.03.2009
Сообщений: 852
17.04.2009, 16:08     После объявления деструктора программа перестает выводить данные на экран #3
Явно объявлять деструктор нужно только для динамически-созданных данных (с помощью new, malloc). Память под статические данные (как в твоём примере) выделяется на этапе компилирования и очищается только после закрытия программы. Максимум ты можешь их занулить.
Etudiante
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
17.04.2009, 16:58  [ТС]     После объявления деструктора программа перестает выводить данные на экран #4
а теперь вот такая проблема:
добавляю объект класса Etudiant

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using namespace std;
 
int main() {
 
Racine** tab =new Racine*[10];
unsigned int count = 0;
 
int _note[10] = {1,2,3,4,5,6,7};
 
 
 
 
tab[count++] = new Etudiant("etudiant1", "etudiant1@xxx.fr", 25, "Mastere Specialisee", 12, 1); // объект класса студент  
tab[count++] = new Employe("MonsieurX", "MonsieurX@enst.fr", 40, "TSI", "CXX");
//tab[count++] = new Eleve("etudiant2", "etudiant2@.xxx.fr", 25, "Mastere Specialisee", 12, 2, _note);
 
 for(unsigned int i=0;  i<=count; i++)
//int i=0;
 
   tab[i]->afficher();
  
}
класс реализован так:

файл .hh

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
#include "Racine.hh"
 
 
#ifndef _ETUDIANT_HH
#define _ETUDIANT_HH
 
class Etudiant : public Racine {
protected:
  std::string type;
  int longeur, annee; //longeurs ={nombre de mois}; annee = {1,2,3} 
 
public: 
  Etudiant();
  Etudiant(const std::string &_nom, const std::string &_mail, int _age,
          const std::string &_type, int _longeur, int _annee);
          
 virtual ~Etudiant(){}; 
          
void afficher() const;  
    
  void put_type(const std::string &t);
  const std::string &get_type() const;
 
  void put_longeur(int l);
  const int get_longeur() const;
 
  void put_annee(int an);
  const int get_annee() const;
  
  virtual const int note_globale() const = 0;
 
};
 
#endif
файл .сс
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
55
56
57
58
#include <iostream>
#include "Racine.hh"
#include "Etudiant.hh"
 
 
using namespace std;
 
Etudiant::Etudiant()
{}
 
Etudiant::Etudiant(const std::string &_nom, const std::string &_mail, int _age,
 const std::string &_type, int _longeur, int _annee ):Racine(_nom, _mail, _age)
{
  type = _type;
  longeur = _longeur;
  annee = _annee;
}
 
//Etudiant::~Etudiant(){
    //delete &type;
    //delete &longeur;
    //delete &annee;
//}
 
void Etudiant::afficher() const {
cout <<"Nom: "<< get_nom()<<"\n";
    cout <<"Mail: "<< get_mail()<<"\n"; 
    cout <<"Age: "<< get_age()<<"\n";
    cout <<"Type: "<< get_type()<<"\n";
    cout <<"Longeur: "<< get_longeur()<<"\n";
    cout <<"Annee: "<< get_annee()<<"\n";
    cout <<"\n";
}
 
  void Etudiant::put_type(const string &t){
    type = t;
  }
 
  const string &Etudiant::get_type()const {
    return type;
  }
 
 
  void Etudiant::put_longeur(int l){
    longeur = l;
  }
 
  const int Etudiant::get_longeur() const{
    return longeur;
  }
 
  void Etudiant::put_annee(int an){
    annee = an;
  }
 
  const int Etudiant::get_annee() const{
    return annee;
  }
пытаюсь сделать виртуальный пустой деструктор (виртуальный, потому что в классе есть виртуальная функция note_globale()) , компилятор говорит:

cannot allocate an object of type Etudiant because the follow virtual function is abstract.

Препод хочет, чтобы эта функция была абстрактной и не реализовывалась в классе Etudiant, а реализовывалась в его подклассах (в данном случае класс Eleve).

Подскажите, плиз, что я делаю не так?
darkAngel
Технофашист
214 / 195 / 4
Регистрация: 11.03.2009
Сообщений: 852
17.04.2009, 17:04     После объявления деструктора программа перестает выводить данные на экран #5
C++
1
virtual const int note_globale() const = 0;
Это чисто вирутальный метод. Класс соержащий хоть 1 чисто виртуальный метод яв-ся абстарктным. А объекты абстрактных классов создавать нельзя.
Etudiante
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
17.04.2009, 17:16  [ТС]     После объявления деструктора программа перестает выводить данные на экран #6
а как тогда можно сделать?

Добавлено через 5 минут 4 секунды
тоесть в таком случае нужно всегда создавать не объект класса Etudiant а объект его подкласса, где абстрактная функция уже реализована?
ISergey
Maniac
Эксперт С++
1346 / 879 / 51
Регистрация: 02.01.2009
Сообщений: 2,643
Записей в блоге: 1
17.04.2009, 17:18     После объявления деструктора программа перестает выводить данные на экран #7
эту фун-ю
C++
1
virtual const int note_globale() const = 0;
засунь в класс Racine а в классе Etudiant сделай реализацыю.
Вот пример
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
#include <iostream>
using namespace std;
 
class Base
{
public:
    Base():x(10) {}
    virtual int my_function() = 0;
protected:
    int x;
};
class Emp1: public Base
{
public:
    int my_function(){ return x; }
};
class Emp2: public Base
{
public:
    int my_function(){ return x*2; }
};
int main()
{
    Base *cl1 = new Emp1;
    Base *cl2 = new Emp2;
    cout<<cl1->my_function()<<endl;
    cout<<cl2->my_function()<<endl;
    delete cl1;
    delete cl2;
    return 0;
}
Etudiante
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
17.04.2009, 17:21  [ТС]     После объявления деструктора программа перестает выводить данные на экран #8
спасибо, хорошая идея
darkAngel
Технофашист
214 / 195 / 4
Регистрация: 11.03.2009
Сообщений: 852
17.04.2009, 17:23     После объявления деструктора программа перестает выводить данные на экран #9
Абстрактные классы предназначенный для представления общих понятий и используются только в качестве БАЗОВЫХ классов.


Чисто виртуальный метод должен быть объявлен в твоём родительском - базовом классе, а не в производных.
ПОнимаешь, ты создаёшь базовый класс. В нём должно уместиться всё то, что будет общим у производных классов (т.е. если класс дерево, то основные элементы это лист, ветка, ствол, корени. Эти есть эелементы будут у всех деревьев. А в производных классах ты уже реализуешь дополнительно комуто почки, комуто цветочки, комуто пух.
Ну ведь ты же не будешь создавать объект ДЕРЕВО?! есть объект сосна, тополь, берёза, осина, но понятие дерево это не конкретное растение же ведь. парвильно? Так вот этот базовый класс ты и делаешь абстрактным (с чисто виртуальными методами), ибо обхекты его тебе не понадобяться. только потомки
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2009, 17:29     После объявления деструктора программа перестает выводить данные на экран
Еще ссылки по теме:

C++ Обрабатывать данные о машинах, и выводить на экран информацию о машинах выбранной марки
C++ Shared_str реализация - На выходе из деструктора падает программа
Программа выдаёт ошибку при вызове деструктора C++
Программа выводит только 1 знак после запятой, хотя должна выводить больше C++
Использование объекта после вызова деструктора C++

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

Или воспользуйтесь поиском по форуму:
Etudiante
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
17.04.2009, 17:29  [ТС]     После объявления деструктора программа перестает выводить данные на экран #10
Спасибо, я уже поняла
Видимо, это и была цель упражнения.

Что-то уже как-то слишком вежливо получается, но еще раз спасибо всем за подробные объяснения и потраченное время
Yandex
Объявления
17.04.2009, 17:29     После объявления деструктора программа перестает выводить данные на экран
Ответ Создать тему
Опции темы

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