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

Ошибка в перегрузке конструктора копирования

14.11.2013, 15:33. Показов 1132. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// strimem.cpp
// Класс String с экономией памяти
// Перегружаемая операция присваивания и конструктор         // копирования
#include <iostream>
#include <cstring>              // для strcpy() и т. д.
using namespace std;
///////////////////////////////////////////////////////////
class strCount                  // Класс-счетчик уникальных строк
  {                    private:
    int count;                  // собственно счетчик
    char* str;                  // указатель на строку
    friend class String;        // сделаем себя доступными
    //методы скрыты
//---------------------------------------------------------
    strCount(char* s)           // конструктор с одним аргументом
      {
      int length = strlen(s);   // длина строкового
                                // аргумента
      str = new char[length+1]; // занять память
                                // под строку
      strcpy(str, s);           // копировать в нее аргументы
      count=1;                  // считать с единицы
      }
//---------------------------------------------------------
    ~strCount()                 // деструктор
      { delete[] str; }         // удалить строку
  };
///////////////////////////////////////////////////////////
class String                    // класс String
  {
  private:
    strCount* psc;              // указатель на strCount
  public:
    String()                    // конструктор без аргументов
    {psc = new strCount("NULL");}
 
//---------------------------------------------------------
    String(char *s)             // конструктор с одним аргументом
    { psc = new strCount(s);}
//---------------------------------------------------------
    String ( String& S)         // конструктор копирования
    {
        psc = S.psc;
        (psc->count)++;
    }
 
//---------------------------------------------------------
    ~String()                   // деструктор
      {
      if(psc->count==1)         // если последний
                                // пользователь,
        delete psc;             // удалить strCount
      else                      // иначе
        (psc->count)--;         // уменьшить счетчик
      }
//---------------------------------------------------------
    void display()              // вывод String
      {
      cout << psc->str;         // вывести строку
      cout << " (addr=" << psc << ")";  // вывести адрес
      }
//---------------------------------------------------------
    void operator = (String& S) // присвоение String
      {
      if(psc->count==1)         // если последний
                                // пользователь,
        delete psc;             // удалить strCount
      else                      // иначе
        (psc->count)--;         // уменьшить счетчик
      psc = S.psc;              //использовать strCount
                                //аргумента
      (psc->count)++;           //увеличить счетчик
      }
  };
///////////////////////////////////////////////////////////
int main()
  {
  String s3 = "Муха по полю пошла, муха денежку нашла";
  cout << "\ns3="; s3.display(); //вывести s3
 
  String s1;                     //определить объект String
  s1 = s3;                       //присвоить его другому объекту
  cout << "\ns1="; s1.display(); //вывести его
 
  String s2(s3);                 //инициализация
  cout << "\ns2="; s2.display(); //вывести
                                 //инициализированное
  cout << endl;
  return 0;
  }
Все конструкторы есть. В чем причина ошибки??
Миниатюры
Ошибка в перегрузке конструктора копирования  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.11.2013, 15:33
Ответы с готовыми решениями:

В чём отличия конструктора копирования и конструктора перемещения? Где и как их нужно использовать?
Помогите разобраться в копирующем и перемещающем конструкторах. В чём их существенное отличие и какой плюс от использования перемещающего...

Касательно конструктора копирования
Вопрос следующий. У меня есть класс &quot;Точки&quot; есть класс &quot;группы&quot; и есть класс &quot;возможные группы&quot;. 3 класса. в классе...

Не понятна работа конструктора копирования
Добрый день! Читаю Шилдта базовый курс. Дошел до конструктора копии.В книжных примерах вроде все понятно было. Перешел на перегрузку...

10
98 / 34 / 10
Регистрация: 24.04.2012
Сообщений: 151
14.11.2013, 15:42
У меня на VS 2008 всё работает, конструктор в классе strCount объяви с спецификаторам паблик если не поможет создай конструктор в strCount без параметров т.е. по умолчанию.
0
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 13
14.11.2013, 16:01  [ТС]
Паблик не помог.
Strcount без параметров? а как тогда адрес на строку передавать?

Добавлено через 9 минут
Да в студии и у меня запустилось. А вот почему Qt бастует не ясно
0
98 / 34 / 10
Регистрация: 24.04.2012
Сообщений: 151
14.11.2013, 16:27
иногда компиляторы помимо конструктора с параметрами требуют конструктор по умолчанию, и если не ошибаюсь конструкторы всегда должны быть пабликами
0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
14.11.2013, 16:46
Нужно больше констов
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <iostream>
#include <cstring>              // для strcpy() и т. д.
using namespace std;
///////////////////////////////////////////////////////////
class strCount                  // Класс-счетчик уникальных строк
  {                    private:
    int count;                  // собственно счетчик
    char* str;                  // указатель на строку
    friend class String;        // сделаем себя доступными
    //методы скрыты
//---------------------------------------------------------
    strCount(const char* s)           // конструктор с одним аргументом
      {
      int length = strlen(s);   // длина строкового
                                // аргумента
      str = new char[length+1]; // занять память
                                // под строку
      strcpy(str, s);           // копировать в нее аргументы
      count=1;                  // считать с единицы
      }
//---------------------------------------------------------
    ~strCount()                 // деструктор
      { delete[] str; }         // удалить строку
  };
///////////////////////////////////////////////////////////
class String                    // класс String
  {
  private:
    strCount* psc;              // указатель на strCount
  public:
    String()                    // конструктор без аргументов
    {psc = new strCount("NULL");}
 
//---------------------------------------------------------
    String(const char *s)             // конструктор с одним аргументом
    { psc = new strCount(s);}
//---------------------------------------------------------
    String ( const String& S)         // конструктор копирования
    {
        psc = S.psc;
        (psc->count)++;
    }
 
//---------------------------------------------------------
    ~String()                   // деструктор
      {
      if(psc->count==1)         // если последний
                                // пользователь,
        delete psc;             // удалить strCount
      else                      // иначе
        (psc->count)--;         // уменьшить счетчик
      }
//---------------------------------------------------------
    void display()              // вывод String
      {
      cout << psc->str;         // вывести строку
      cout << " (addr=" << psc << ")";  // вывести адрес
      }
//---------------------------------------------------------
    void operator = (const String& S) // присвоение String
      {
      if(psc->count==1)         // если последний
                                // пользователь,
        delete psc;             // удалить strCount
      else                      // иначе
        (psc->count)--;         // уменьшить счетчик
      psc = S.psc;              //использовать strCount
                                //аргумента
      (psc->count)++;           //увеличить счетчик
      }
  };
///////////////////////////////////////////////////////////
int main()
  {
  String s3 = "Муха по полю пошла, муха денежку нашла";
  cout << "\ns3="; s3.display(); //вывести s3
 
  String s1;                     //определить объект String
  s1 = s3;                       //присвоить его другому объекту
  cout << "\ns1="; s1.display(); //вывести его
 
  String s2(s3);                 //инициализация
  cout << "\ns2="; s2.display(); //вывести
                                 //инициализированное
  cout << endl;
  return 0;
  }
Добавлено через 1 минуту
Цитата Сообщение от Alexxx7 Посмотреть сообщение
иногда компиляторы помимо конструктора с параметрами требуют конструктор по умолчанию, и если не ошибаюсь конструкторы всегда должны быть пабликами
компиляторы требуют конструктор по умолчанию, если он нужен. Если он не вызывается (явно/неявно), то ошибки не будет. Конструкторы не обязательно должны быть пабликами
2
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 13
15.11.2013, 10:23  [ТС]
А в чем фишка. Где можно почитать ?

Добавлено через 17 часов 12 минут
Ну в любом случае спасибо. Впредь буду учитывать магию const))
0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 10:30
А конструктор разве можно перегружать?

Добавлено через 3 минуты
можно!
0
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 13
15.11.2013, 10:31  [ТС]
Куда интересней - почему без const'ов в объявлении не работает
0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
15.11.2013, 12:33
Немного запоздало, но
конструктор копирования имеет сигнатуру
C++
1
class_name(const class_name&);
аналогично дела обстоят с оператором присваивания
в некоторых местах тип входного параметра я поменял на const char*
это потому, что строка вида "text" - это и есть const char*, а не просто char*
1
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 13
15.11.2013, 12:38  [ТС]
Ну да кажется понял. Не поставить const в данном примере с точки зрения компилятора равнозначно попытке изменить значение указателя на константу. Это я решил почитать Страуструпа. Его сухой стиль как-то способствует шевелению извилин. Но в любом случае спасибо за ответ.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.11.2013, 14:24
Цитата Сообщение от I.M. Посмотреть сообщение
конструктор копирования имеет сигнатуру
Вы не совсем правы.
12.8.2 A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&,
volatile X& or const volatile X&
, and either there are no other parameters or else all other parameters
have default arguments (8.3.6).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.11.2013, 14:24
Помогаю со студенческими работами здесь

Подскажите реализацию конструктора копирования
Подскажите пожалуйста как реализовать конструктор копирования. #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; ...

Неявный вызов конструктора копирования
Здравствуйте, как можно неявно вызвать конструктор копирования 3 способами? Я только 1 найти смог. #include &lt;iostream&gt; ...

Пример конструктора копирования не понятен
Задание: есть класс, одним из пунктом является написание класса копирования. Есть такой код Phone::Phone(Phone *a){ ...

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

Реализация конструктора копирования и перегрузки =
#include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; class Cow{ private: char name; char *...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru