Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 17
1

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

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

Author24 — интернет-сервис помощи студентам
Нужна помощь, коллеги, так как сам ничего не понял. Создал класс. Хотелось бы, чтобы при создании объекта явный конструктор класса специфицировал два параметра из 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.11.2012, 21:53
Ответы с готовыми решениями:

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

Почему не работает конструктор?
- Смысл моего вопроса становится ясен из минимального примера приведенного ниже: ...

Почему не работает конструктор копирования?
Подскажите, пожалуйста, где ошибка в коде? Вылетает прога с ошибкой.. #include &quot;stdafx.h&quot;...

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

30
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
13.11.2012, 22:01 2
Ну странно, что компилятор ошибок не выдаёт. Твои функции setName и setName2 должны возвращать что-то типа string, а они ничего не возвращают.
0
4311 / 1422 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
13.11.2012, 22:04 3
Не пойму, к чему в конструкторе вызывать какие-то функции? Сделать так:
C++
1
2
3
4
5
  Book (string name, string name2 )
  {
     elDat = name;  
      elDat2 = name2;                        
  }
и все успешно сработает.
0
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
13.11.2012, 22:11 4
Тогда уж так:
C++
1
Book(const string & name, const string & name2) : elDat(name), elDat2(name2) {}
0
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
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
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
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
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
13.11.2012, 22:27 8
А свои функции установки удалил или оставил?
Что за компилятор, кстати?
0
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
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
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 17
13.11.2012, 22:51  [ТС] 13
Цитата Сообщение от Croessmah Посмотреть сообщение
То есть классы еще не изучили нормально, а используют string? ИМХО, бред!

Не по теме:

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

0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
13.11.2012, 22:53 14

Не по теме:

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



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

Не по теме:

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

1
Nweo
13.11.2012, 23:03  [ТС]
  #15

Не по теме:

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

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

0
Kuzia domovenok
13.11.2012, 23:08
  #16

Не по теме:

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

0
Croessmah
13.11.2012, 23:10
  #17

Не по теме:

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

0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
13.11.2012, 23:13 18
Цитата Сообщение от Nweo Посмотреть сообщение
По букварю (Дейтелы) условие такое. Авторы аргументируют тем, что в set-функции класса, устанавливающем значение элементов данных в области доступа private, можно реализовать полезные дополнения, в виде проверки корректности вводимых данных. При этом в случае необходимости надо будет модифицировать только эту set-функцию, не трогая остальные клиенты элементов данных.
Теперь конструтор перестает быть exception-safe. А это может повлечь за собой всякие веселые вещи, например, не будет вызываться деструтор для объекта. В C++11 можно заюзать делегирование конструкторов.
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
#include <iostream>
 
struct Foo
{
    Foo()
    {
        std::cout << "Foo()" << std::endl;
    }
 
    template <class... Args>
    Foo(Args&&...): Foo()
    {
        std::cout << "Foo(...)" << std::endl;
        throw_an_exception();
    }
 
    void throw_an_exception()
    {
        throw 42;
    }
 
    ~Foo()
    {
        std::cout << "~Foo()" << std::endl;
    }
};
 
int main()
{
    try
    {
        Foo();
        Foo(3.14);
    }
    catch(...)
    {
        std::cout << "Exception" << std::endl;
    }
    return 0;
}
Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
То есть классы еще не изучили нормально, а используют string? ИМХО, бред!
Для использования контейнера std::string не обязательно знать классы, но надо уметь работать с указателями и выделением памяти, поскольку первое - лишь способ реализации.
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
13.11.2012, 23:14 19
Цитата Сообщение от soon Посмотреть сообщение
Для использования контейнера std::string не обязательно знать классы, но необходимо знать работу с указателями и выделением памяти, поскольку первое - лишь способ реализации.
Для использования - да, но к пониманию работы со строками это не приведет никак!
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
13.11.2012, 23:19 20
Croessmah, я уже сказал, что требуется для понимания работы контейнера std::string. Работа с выделением памяти и указателями. Классы ну никак этому не способствуют. Все равно, что сказать - для понимания работы деревьев(в частности - std::set и иже с ним) надо изучить классы.
0
13.11.2012, 23:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2012, 23:19
Помогаю со студенческими работами здесь

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

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

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

Почему не вызывается конструктор копии?
Почему не вызывается конструктор копии? class CPoint { friend std::istream...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru