Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47

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

17.04.2009, 15:53. Показов 1236. Ответов 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(); //вывод на экран (реализация выше)
  
  
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.04.2009, 15:53
Ответы с готовыми решениями:

После пробуждения из спящего режима программа перестает отправлять данные на сервер
Приветствую. Есть программа, периодически отправляет данные на сервер. Заметил, что если комп уходит в спячку, то после пробуждения...

После выполнения "левого" IBQuery (sql запрос) DBGrid перестаёт выводить таблицу
структура на картинке. изначально IBQueryStuffAdd.SQL пуста, а в IBQuery1.SQL - вывод таблицы. так вот - когда я программно...

Выводить данные на текстовый экран
На Raspberry Pi есть программа для печати на 3D-принтере. К raspberry подключен текстовый экран и блок кнопок, нужно взаимодействие с этой...

9
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
17.04.2009, 15:57
Тело деструктора в твоем случае должно быть пустым:
C++
1
2
3
Racine::~Racine() 
{
}
1
Технофашист
228 / 216 / 11
Регистрация: 11.03.2009
Сообщений: 887
17.04.2009, 16:08
Явно объявлять деструктор нужно только для динамически-созданных данных (с помощью new, malloc). Память под статические данные (как в твоём примере) выделяется на этапе компилирования и очищается только после закрытия программы. Максимум ты можешь их занулить.
0
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
17.04.2009, 16:58  [ТС]
а теперь вот такая проблема:
добавляю объект класса 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 Spe******ee", 12, 1); // объект класса студент  
tab[count++] = new Employe("MonsieurX", "MonsieurX@enst.fr", 40, "TSI", "CXX");
//tab[count++] = new Eleve("etudiant2", "etudiant2@.xxx.fr", 25, "Mastere Spe******ee", 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).

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

Добавлено через 5 минут 4 секунды
тоесть в таком случае нужно всегда создавать не объект класса Etudiant а объект его подкласса, где абстрактная функция уже реализована?
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
17.04.2009, 17:18
эту фун-ю
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;
}
1
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
17.04.2009, 17:21  [ТС]
спасибо, хорошая идея
0
Технофашист
228 / 216 / 11
Регистрация: 11.03.2009
Сообщений: 887
17.04.2009, 17:23
Абстрактные классы предназначенный для представления общих понятий и используются только в качестве БАЗОВЫХ классов.


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

Что-то уже как-то слишком вежливо получается, но еще раз спасибо всем за подробные объяснения и потраченное время
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.04.2009, 17:29
Помогаю со студенческими работами здесь

После вызова рекурсивной функции программа перестаёт работать
int mat,size,x=1,y, a=0, b=1; void mtt(int mat, int a, int b); int main(){ cin&gt;&gt;size; mtt(mat,a,b); cout&lt;&lt;&quot;JJ&quot;;//НЕ...

Программа перестает компилироваться после подключения библиотеки <Afx.h>
#include &quot;stdafx.h&quot; #include &lt;fstream&gt; #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;Afx.h&gt; using...

[Selenium] После 5 часов работы программа перестает работать
c# + selenium Программа парсит с сайта информацию, но после 5 часов работы останавливается. Зависает что ли. Клацаешь по кнопке на форме...

Как выводить на экран и вводить данные типа wchar_t[]?
Вопрос в том, как это сделать на Windows. На Linux-е это просто setlocale(LC_CTYPE, &quot;&quot;); //а потом wprintf ... На Windows такое не...

Программа перестает отвечать после сворачивания или перехода на другое окно
Такая проблема. Программа перестает отвечать после сворачивания. То есть если если включить, она работает, потом сворачиваешь, или...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru