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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Nweo
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 17
13.11.2012, 21:53     Почему конструктор не работает? #1
Нужна помощь, коллеги, так как сам ничего не понял. Создал класс. Хотелось бы, чтобы при создании объекта явный конструктор класса специфицировал два параметра из 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++ Почему конструктор не должен иметь возвращаемое значение?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
13.11.2012, 23:29     Почему конструктор не работает?
  #21

Не по теме:

Цитата Сообщение от soon Посмотреть сообщение
Croessmah, я уже сказал, что требуется для понимания работы контейнера std::string. Работа с выделением памяти и указателями. Классы ну никак этому не способствуют. Все равно, что сказать - для понимания работы деревьев(в частности - std::set и иже с ним) надо изучить классы.
Вы меня не поняли. Я веду к тому, что сначала нужно научиться работать стандартными методами, а потом уже переходить к STL. Иначе что мы получаем? Работать с массивами символов не умеем, использовали basic_string всегда, выделить кусок памяти для массива тоже не особо много практики, ибо всегда юзали vector, сделать свой связанный список тоже не в состоянии, потому что нам сказали, что list - это круто! Выделив память не знаем как с ней обращаться, потому что все делали за нас.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
13.11.2012, 23:30     Почему конструктор не работает? #22
а как объяснить, что у переменных этого типа можно вызывать методы, а у других нельзя? И прочие непохожести на встроенные типы Си? При изучении Сей у K&R чётко всё шло от элементарного к более сложному. При представлении каждого нового объекта в языке чётко расписывались все нюансы его применения.
Nweo
13.11.2012, 23:31  [ТС]
  #23

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
программист должен разбираться в том, что использует вплоть до битовых операций, областей в памяти и прочего низкоуровневого
В принципе да. Хотя и скучно, конечно, но что поделаешь...

Цитата Сообщение от Croessmah Посмотреть сообщение
Но для этого мы учились в автошколе на права. Да и вообще знаем примерное устройство авто, иначе получается "обезьяна с гранатой"
Я не против углубленного обучения, почему бы и нет? Но чтобы понять принцип работы рулевой системы, совсем не обязательно углубляться в работу топливной системы, так? Достаточно на время принять, что при надавливании на эту педаль, которая отвечает за ускорение, нужно рулить, а рулевая система устроена следующим образом... и далее по тексту. Вот в этом и состоит преимущество подхода Дейтелов: разумное отсутствие педантичности, и в то же время отменное понимание нужд студентов. Благо, они имеют громадный (и реальный!) опыт преподавания, в отличие от некоторых писателей. А это означает, что они в жизни сталкивались с затруднениями новичков, и за годы наработали великолепный стиль утилизации этих затруднений. Это в самом деле чувствуется по книге. Ну просто небо и земля по сравнению с некоторыми другими книгами.

soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
13.11.2012, 23:35     Почему конструктор не работает? #24
Цитата Сообщение от Croessmah Посмотреть сообщение
Вы меня не поняли. Я веду к тому, что сначала нужно научиться работать стандартными методами, а потом уже переходить к STL. Иначе что мы получаем? Работать с массивами символов не умеем, использовали basic_string всегда, выделить кусок памяти для массива тоже не особо много практики, ибо всегда юзали vector, сделать свой связанный список тоже не в состоянии, потому что нам сказали, что list - это круто! Выделив память не знаем как с ней обращаться, потому что все делали за нас.
Возможно. Я именно это и имел в виду. Меня просто смутила ваша фраза "То есть классы еще не изучили нормально, а используют string? ИМХО, бред!".
Croessmah
13.11.2012, 23:35
  #25

Не по теме:

Цитата Сообщение от Nweo Посмотреть сообщение
Благо, они имеют громадный (и реальный!) опыт преподавания
C++
1
2
3
4
string setName ( string name)
{
  elDat = name;
}
и, скорее всего именно из-за их очень большого опыта у Вас тут 2 вызова конструктора копирования, а если добавить return, то будет еще и третий, да и вернется не совсем то, чего ожидали.

Nweo
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 17
13.11.2012, 23:37  [ТС]     Почему конструктор не работает? #26
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
И прочие непохожести на встроенные типы Си? При изучении Сей у K&R чётко всё шло от элементарного к более сложному.
Пошла какая-то мне непонятная "профессиональная матерщна". Пойду-ка я отсюда
А серьезно говоря, спасибо, коллеги, за подсказку по теме!
John Prick
13.11.2012, 23:38
  #27

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
а как объяснить, что у переменных этого типа можно вызывать методы, а у других нельзя?
Ну ведь их можно и не вызывать, а по началу использовать класс string как тип строки, например, в паскале. Практика, конечно, пагубная, но м.б. для изучения подойдёт. Потому как строки используются повсеместно в учебных задачах, а такая беда, что специализированного типа строки в С++ нет, новичка не должна беспокоить в принципе.

soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
13.11.2012, 23:41     Почему конструктор не работает? #28
Цитата Сообщение от Croessmah Посмотреть сообщение
и, скорее всего именно из-за их очень большого опыта у Вас тут 2 вызова конструктора копирования, а если добавить return, то будет еще и третий, да и вернется не совсем то, чего ожидали.
Я уверен, это либо не весь код, либо ТС неправильно списал. Функция должна возвращать std::string, чего не делается. В результате segfault. Чтобы сказать более точно, нужно копать стандарт и лезть в ассемблер. Но не думаю, что это будет кому-либо интересно, поскольку основная причина уже названа.
Nweo
14.11.2012, 07:14  [ТС]
  #29

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение

Не по теме:


C++
1
2
3
4
string setName ( string name)
{
  elDat = name;
}
и, скорее всего именно из-за их очень большого опыта у Вас тут 2 вызова конструктора копирования, а если добавить return, то будет еще и третий, да и вернется не совсем то, чего ожидали.

Если бы не их опыт, даже до этого места в программировании не дошел бы.
Что стринг написал в начале - это да, моя ошибка.
К сожалению, не вижу в этом отрезке кода 2 вызова конструктора копирования. Только одна операция присваивания (копирования) значения elDat = name; А где второй вызов? И какой конструктор копирования Вы имеете в виду? Book? Или страндартный конструктор копирования C++?

Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
14.11.2012, 07:28     Почему конструктор не работает? #30
Ребят, книга Дейтлов все же неплохая. В первых главах они просто используют раннее введение в классы, демонстрируют как можно пользоваться тем же std::string. Потом уже все подробнее разжевывается - и встроенные типы и возможности STL.

Добавлено через 2 минуты
Цитата Сообщение от Nweo Посмотреть сообщение
А где второй вызов? И какой конструктор копирования Вы имеете в виду?
Смотри, в твою функцию аргумент передается по значению, то есть создается локальная копия - string name. Для этого и вызывается конструктор копирования. Потом в книге будет объяснена передача по ссылке и ее преимущества.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2012, 15:48     Почему конструктор не работает?
Еще ссылки по теме:

C++ Почему конструктор в отличаи от деструктора не может быть виртуальным?
Почему конструктор вызывается повторно при преобразовании типов? C++
Почему не вызывается конструктор копии? C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
14.11.2012, 15:48     Почему конструктор не работает? #31
Цитата Сообщение от Schizorb Посмотреть сообщение
Ребят, книга Дейтлов все же неплохая. В первых главах они просто используют раннее введение в классы, демонстрируют как можно пользоваться тем же std::string. Потом уже все подробнее разжевывается - и встроенные типы и возможности STL.
Мне больше нравится книга Девиса. Вся книга - только основы языка.
Yandex
Объявления
14.11.2012, 15:48     Почему конструктор не работает?
Ответ Создать тему
Опции темы

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