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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Nweo
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 17
#1

Почему конструктор не работает? - C++

13.11.2012, 21:53. Просмотров 1179. Ответов 30
Метки нет (Все метки)

Нужна помощь, коллеги, так как сам ничего не понял. Создал класс. Хотелось бы, чтобы при создании объекта явный конструктор класса специфицировал два параметра из string. При попытке специфицировать два параметра компилятор ошибки не выдает, но при запуске программа вылетает. Вот код, проблемное место выделил комментом:
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
//Создать объект my класса Book и вывести 2 параметра объекта my.
#include <iostream>
 
using namespace std;
 
class Book
{
public:
  Book (string name, string name2 )
  {
    setName ( name );
    setName2 ( name2 ); // Вот эта строка. При комментировании этой строки запускается  
                                  // нормально. А вот при открытии... Ничего не могу понять :(
  }
 
string setName ( string name)
{
  elDat = name;
}
 
string setName2 (string name2)
{
  elDat2 = name2;
}
 
void dMess()
{
  cout << elDat<< endl << elDat2;
}
 
private:
  string elDat;
  string elDat2;
};
 
int main()
{
  Book my("too","too2");
  my.dMess();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2012, 21:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему конструктор не работает? (C++):

Почему не работает конструктор? - C++
подскажите почему не инициализируется а4? Почему не происходит неявного вызова конструктора с одним аргументом, а после обычный конструктор...

Не работает конструктор копирования почему-то... - C++
#include &quot;stdlib.h&quot; #include &quot;stdio.h&quot; #include &lt;iostream&gt; #include &lt;cstddef&gt; using namespace std; class Top { public: ...

Неправильно работает конструктор копирования list, почему? - C++
#include &lt;windows.h&gt; #include &lt;stdio.h&gt; #include &lt;list&gt; #include &lt;iterator&gt; #include &lt;iostream&gt; using namespace std; list...

Почему не работает следующий код из книги Страуструпа (конструктор значений по умолчанию) - C++
#include&lt;iostream&gt; using namespace std; class Date { int a, b; static Date default_date; public: Date(int x = 0, int...

Почему не вызывается конструктор перемещения? - C++
#include &lt;iostream&gt; #include &lt;vector&gt; class Object { public: Object() { std::cout &lt;&lt; &quot;Object()&quot; &lt;&lt; std::endl; ...

Почему не вызывается конструктор копии? - C++
Почему не вызывается конструктор копии? class CPoint { friend std::istream &amp;operator&gt;&gt;(std::istream &amp;in, CPoint &amp;obj); friend...

30
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
13.11.2012, 22:01 #2
Ну странно, что компилятор ошибок не выдаёт. Твои функции setName и setName2 должны возвращать что-то типа string, а они ничего не возвращают.
0
BumerangSP
4286 / 1408 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
13.11.2012, 22:04 #3
Не пойму, к чему в конструкторе вызывать какие-то функции? Сделать так:
C++
1
2
3
4
5
  Book (string name, string name2 )
  {
     elDat = name;  
      elDat2 = name2;                        
  }
и все успешно сработает.
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
13.11.2012, 22:11 #4
Тогда уж так:
C++
1
Book(const string & name, const string & name2) : elDat(name), elDat2(name2) {}
0
Nweo
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 17
13.11.2012, 22:16  [ТС] #5
Цитата Сообщение от John Prick Посмотреть сообщение
Ну странно, что компилятор ошибок не выдаёт. Твои функции setName и setName2 должны возвращать что-то типа string, а они ничего не возвращают.
Да, они не должны возвращать, только установить значение элементов данных (elDat и elDat2).

Цитата Сообщение от BumerangSP Посмотреть сообщение
Не пойму, к чему в конструкторе вызывать какие-то функции? Сделать так:
По букварю (Дейтелы) условие такое. Авторы аргументируют тем, что в set-функции класса, устанавливающем значение элементов данных в области доступа private, можно реализовать полезные дополнения, в виде проверки корректности вводимых данных. При этом в случае необходимости надо будет модифицировать только эту set-функцию, не трогая остальные клиенты элементов данных.
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
13.11.2012, 22:23 #6
Цитата Сообщение от Nweo Посмотреть сообщение
Да, они не должны возвращать
Тогда зачем объявлен тип возвращаемого значения? Напишите там void и будет вам счастье.

Добавлено через 45 секунд
C++
1
2
3
4
5
6
7
8
9
void setName ( string name)
{
  elDat = name;
}
 
void setName2 (string name2)
{
  elDat2 = name2;
}
Добавлено через 55 секунд
А параметры всё же лучше передавать по константной ссылке:
C++
1
void setName(const string & name)
1
Nweo
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 17
13.11.2012, 22:24  [ТС] #7
Цитата Сообщение от John Prick Посмотреть сообщение
Book(const string & name, const string & name2) : elDat(name), elDat2(name2
С этим кодом так же вылетает, вот дословно: "An unhandled win32 exception occurred in Hw.exe [2532]. Just-In-Time debugging this exception failed with the folloing error: No installed debugger has Just-In-Time debugging enabled. In Visual Studio, Just-In-Time debugging can be enabled from
Tools/Options/Debugging/Just-In-Time.
Check the documentation index for 'Just-in-time debugging, errors' for the more information."

При этом компилятор возвращает 0.
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
13.11.2012, 22:27 #8
А свои функции установки удалил или оставил?
Что за компилятор, кстати?
0
Nweo
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 17
13.11.2012, 22:32  [ТС] #9
Цитата Сообщение от John Prick Посмотреть сообщение
Тогда зачем объявлен тип возвращаемого значения? Напишите там void и будет вам счастье.
Да, есть на белом свете счастье Действительно, вместо void написал string, эх Спасибо большое!
До константной ссылки, надеюсь, скоро дойду

Не по теме:

PS: Очень нравится книга Дейтелов, очень доходчиво пишут. Пробовал много книг, но вот эта... Сразу видно, разрабатывали тщательнейшим образом.

0
Croessmah
13.11.2012, 22:34
  #10

Не по теме:

Цитата Сообщение от Nweo Посмотреть сообщение
PS: Очень нравится книга Дейтелов, очень доходчиво пишут. Пробовал много книг, но вот эта... Сразу видно, разрабатывали тщательнейшим образом.
Это пример из книги?

0
Nweo
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 17
13.11.2012, 22:40  [ТС] #11
Цитата Сообщение от John Prick Посмотреть сообщение
А свои функции установки удалил или оставил?
Что за компилятор, кстати?
Закомментил. Компилятор GCC, в ридми написано:
=== TDM-GCC Compiler Suite for Windows ===
--- GCC 4.4/4.5 Series ---
*** Standard MinGW 32-bit Edition ***
Добавлено через 5 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
Это пример из книги?

Не по теме:

Ну что Вы, разве они такое напишут )) Это же крутющие спецы преподавания таким медным чайникам, как я Кстати, понял одно, пока долго-долго выбирал книгу: бывают 3 вида книг по программированию: написанные 1. основателями (например, Страусструп, 2. коммерсантами (просто зашибить деньгу на книжке) и 3. преподавателями. Вот Дейтелы как раз и преподаватели.

0
Croessmah
13.11.2012, 22:42
  #12

Не по теме:

Цитата Сообщение от Nweo Посмотреть сообщение
Это же крутющие спецы преподавания таким медным чайникам, как я
То есть классы еще не изучили нормально, а используют string? ИМХО, бред!

0
Nweo
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 17
13.11.2012, 22:51  [ТС] #13
Цитата Сообщение от Croessmah Посмотреть сообщение
То есть классы еще не изучили нормально, а используют string? ИМХО, бред!

Не по теме:

Тут заступлюсь за своих преподов: как видно из примеров из книги, мы используем тормозную систему автомобиля через посредство педаля тормоза, не зная тонкостей устройства тормозной системы. То же самое и со string-ом: шуруем, не понимая деталей исполнения. Но работает же. Имхо, мне нравится такой подход, практичности много

0
Croessmah
Эксперт CЭксперт С++
13407 / 7557 / 853
Регистрация: 27.09.2012
Сообщений: 18,590
Записей в блоге: 3
Завершенные тесты: 1
13.11.2012, 22:53 #14

Не по теме:

Цитата Сообщение от Nweo Посмотреть сообщение
Тут заступлюсь за своих преподов: как видно из примеров из книги, мы используем тормозную систему автомобиля через посредство педаля тормоза, не зная тонкостей устройства тормозной системы. То же самое и со string-ом: шуруем, не понимая деталей исполнения. Но работает же. Имхо, мне нравится такой подход, практичности много
понимания мало. Что такое string? =)



Добавлено через 1 минуту

Не по теме:

не зная тонкостей устройства тормозной системы
и бежим в автосервис, когда оно поломается, потому что не знаем что там и как

1
Nweo
13.11.2012, 23:03  [ТС]     Почему конструктор не работает?
  #15

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
понимания мало. Что такое string? =)
Пока что для меня - объект класса <string>.

Цитата Сообщение от Croessmah Посмотреть сообщение
и бежим в автосервис, когда оно поломается, потому что не знаем что там и как
Ну да, поначалу Зато пошуровали в это время тормозной педалькой, каких-то целей достигли. Туда съездили, это загрузили-разгрузили. А там, глядишь, и время освободиться и руки дойдут до тормозной системы, да и до топливной, электрической системы, трансмисси тоже можно добраться. Лишь было бы время да здоровье, остальное будет

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2012, 23:03
Привет! Вот еще темы с ответами:

Почему не вызывается конструктор копирования? - C++
...У меня в книге описаны случаи при которых вызывается конструктор копирования. Один из этих случаев: : &quot;Когда аргумент имеет тип...

Почему конструктор не принимает ссылку на строку? - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class Bank { private: string vkladchik; ...

Почему вызывается конструктор, а не создание массива? - C++
struct KTest { KTest(int _a, double _b, long long _c) : a(_a), b(_b), c(_c) {} friend ostream&amp; operator &lt;&lt; (ostream&amp; os, KTest const&amp;...

Почему не срабатывает конструктор копирования в пользовательском классе - C++
вроде со всем разобралась, но не заходит в конструктор копирования. В чём ошибка? #include &lt;iostream&gt; #include &quot;welcome.h&quot; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.11.2012, 23:03
Ответ Создать тему
Опции темы

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