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

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

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

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

13.11.2012, 21:53. Просмотров 1099. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2012, 21:53     Почему конструктор не работает?
Посмотрите здесь:

Почему встроенная функция вызывает конструктор копирования? C++
C++ Почему не вызывается конструктор копирования?
C++ Неправильно работает конструктор копирования list, почему?
C++ Не работает конструктор копирования почему-то...
C++ Почему конструктор не должен иметь возвращаемое значение?
Почему конструктор вызывается повторно при преобразовании типов? C++
Почему не вызывается конструктор копии? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
764 / 697 / 126
Регистрация: 27.07.2012
Сообщений: 1,988
Завершенные тесты: 3
13.11.2012, 22:01     Почему конструктор не работает? #2
Ну странно, что компилятор ошибок не выдаёт. Твои функции setName и setName2 должны возвращать что-то типа string, а они ничего не возвращают.
BumerangSP
4284 / 1406 / 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;                        
  }
и все успешно сработает.
John Prick
764 / 697 / 126
Регистрация: 27.07.2012
Сообщений: 1,988
Завершенные тесты: 3
13.11.2012, 22:11     Почему конструктор не работает? #4
Тогда уж так:
C++
1
Book(const string & name, const string & name2) : elDat(name), elDat2(name2) {}
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-функцию, не трогая остальные клиенты элементов данных.
John Prick
764 / 697 / 126
Регистрация: 27.07.2012
Сообщений: 1,988
Завершенные тесты: 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)
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.
John Prick
764 / 697 / 126
Регистрация: 27.07.2012
Сообщений: 1,988
Завершенные тесты: 3
13.11.2012, 22:27     Почему конструктор не работает? #8
А свои функции установки удалил или оставил?
Что за компилятор, кстати?
Nweo
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 17
13.11.2012, 22:32  [ТС]     Почему конструктор не работает? #9
Цитата Сообщение от John Prick Посмотреть сообщение
Тогда зачем объявлен тип возвращаемого значения? Напишите там void и будет вам счастье.
Да, есть на белом свете счастье Действительно, вместо void написал string, эх Спасибо большое!
До константной ссылки, надеюсь, скоро дойду

Не по теме:

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

Croessmah
13.11.2012, 22:34
  #10

Не по теме:

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

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. преподавателями. Вот Дейтелы как раз и преподаватели.

Croessmah
13.11.2012, 22:42
  #12

Не по теме:

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

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

Не по теме:

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

Croessmah
Модератор
Эксперт CЭксперт С++
12882 / 7268 / 810
Регистрация: 27.09.2012
Сообщений: 17,959
Записей в блоге: 2
Завершенные тесты: 1
13.11.2012, 22:53     Почему конструктор не работает? #14

Не по теме:

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



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

Не по теме:

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

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

Не по теме:

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

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

Kuzia domovenok
13.11.2012, 23:08
  #16

Не по теме:

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

Croessmah
13.11.2012, 23:10
  #17

Не по теме:

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

soon
2537 / 1302 / 81
Регистрация: 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 не обязательно знать классы, но надо уметь работать с указателями и выделением памяти, поскольку первое - лишь способ реализации.
Croessmah
Модератор
Эксперт CЭксперт С++
12882 / 7268 / 810
Регистрация: 27.09.2012
Сообщений: 17,959
Записей в блоге: 2
Завершенные тесты: 1
13.11.2012, 23:14     Почему конструктор не работает? #19
Цитата Сообщение от soon Посмотреть сообщение
Для использования контейнера std::string не обязательно знать классы, но необходимо знать работу с указателями и выделением памяти, поскольку первое - лишь способ реализации.
Для использования - да, но к пониманию работы со строками это не приведет никак!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2012, 23:19     Почему конструктор не работает?
Еще ссылки по теме:

Почему конструктор не принимает ссылку на строку? C++
C++ Почему не работает конструктор?
Почему вызывается конструктор, а не создание массива? C++
C++ Почему не срабатывает конструктор копирования в пользовательском классе
Почему не работает следующий код из книги Страуструпа (конструктор значений по умолчанию) C++

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

Или воспользуйтесь поиском по форуму:
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
13.11.2012, 23:19     Почему конструктор не работает? #20
Croessmah, я уже сказал, что требуется для понимания работы контейнера std::string. Работа с выделением памяти и указателями. Классы ну никак этому не способствуют. Все равно, что сказать - для понимания работы деревьев(в частности - std::set и иже с ним) надо изучить классы.
Yandex
Объявления
13.11.2012, 23:19     Почему конструктор не работает?
Ответ Создать тему
Опции темы

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