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

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

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

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

13.11.2012, 21:53. Просмотров 1107. Ответов 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++
подскажите почему не инициализируется а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++
...У меня в книге описаны случаи при которых вызывается конструктор копирования. Один из этих случаев: : &quot;Когда аргумент имеет тип...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
13.11.2012, 23:29     Почему конструктор не работает?
  #21

Не по теме:

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

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

Не по теме:

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

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

soon
2538 / 1303 / 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
2538 / 1303 / 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
509 / 461 / 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++
#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++
Почему конструктор не должен иметь возвращаемое значение? Мне кажется это было бы полезным.

Почему встроенная функция вызывает конструктор копирования? - C++
Почему встроенная функция вызывает конструктор копирования или всегда ли встроенная функция действительно встроеннаая? Но всё по порядку....

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


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

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

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