0 / 0 / 0
Регистрация: 18.05.2019
Сообщений: 14
1

Почему нельзя вызывать конструктор без аргументов?

03.12.2019, 23:53. Показов 628. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В чем может быть ошибка? На Visual Studio все работает

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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <iostream>
#include <cstring>
 
using namespace std;
 
class CString
{
    char* chars = nullptr;
    size_t length;
public:
    CString() { }
 
    CString(const CString& cs )
    {
        length = cs.length;
        chars = new char[length];
        for (size_t i = 0; i < length; i++)
        chars[i] = cs.chars[i];
    }
    CString(size_t l, char c = ' ')
    {
        length = l;
        chars = new char[length];
        for (size_t i = 0; i < length; i++)
            this->chars[i] = c;
    }
 
    CString(string s) { *this = s; }
    ~CString() { Clear(); }
 
    size_t Length() { return this->length; }
 
    void Clear()
    {
        if (chars)
            delete[]chars;
        chars = nullptr;
        length = 0;
    }
 
    CString& operator= (const string& str)
    {
        Clear();
        length = str.length();
        chars = new char[length];
            memcpy(chars, str.c_str(), length);
        return *this;
    }
 
    CString& operator= (const CString& cs)
    {
        if (this == &cs)
            return *this;
        Clear();
        length = cs.length;
        chars = new char[length];
        for (size_t i = 0; i < length; i++)
            this->chars[i] = cs.chars[i];
        return *this;
    }
    char& operator[] (size_t i)
    {
        if (i < this->length)
            return this->chars[i];
        cout << "Array index out of beyond" << endl;
        exit(-1);
    }
 
CString& operator+= (const string& str)
    {
       *this = *this+ CString(str);
        return *this;
    }
 
    CString& operator+= (const CString& cs)
    {
        return *this = *this + cs;
    }
 
    friend const CString& operator+ (const CString& left, const CString& right);
    friend ostream& operator<< (ostream& out, const CString& cv);
};
 
const CString& operator+ (const CString& left, const CString& right)
{
    size_t res_length = left.length + right.length;
    CString* res = new CString(res_length);
    size_t p = 0;
    for (size_t i = 0; i < left.length; i++, p++)
        res->chars[p] = left.chars[i];
    for (size_t i = 0; i < right.length; i++, p++)
        res->chars[p] = right.chars[i];
    return *res;
}
 
 
std::ostream& operator<< (ostream& out, const CString& cs)
{
    out << '\t' << '\'';
    for (size_t i = 0; i < cs.length; i++)
        out << cs.chars[i];
    out << '\'' << endl;
    return out;
}
 
 
void print_strings(CString& a, CString& b, CString& c)
{
    cout << "A size (" << a.Length() << "):\n" << a;
    cout << "B size (" << b.Length() << "):\n" << b;
    cout << "C size (" << c.Length() << "):\n" << c;
}
 
int main()
{
    cout << "Initialize a with no arguments, initialize b with length and symbol, initialize c with text" << endl;
    CString a = CString();
    CString b(3, '*');
    CString c = CString("Hello!");
    print_strings(a, b, c);
    a = CString(b);
    print_strings(a, b, c);
 
    b[2] = ('t');
    print_strings(a, b, c);
 
    cout << "Demonstrate operator '=' for std::string" << endl;
    a = "QWERTY";
    b = "asdfllkn";
    print_strings(a, b, c);
 
    cout << "Demonstrate operator '=' for CString  and operator '+'" << endl;
    c = a + b;
    print_strings(a, b, c);
 
    cout << "Demonstrate operator '+=' for std::string and CString" << endl;
    a += " + 123";
    b += CString(" + 123");
    print_strings(a, b, c);
 
    return 0;
}
Добавлено через 34 секунды
Предполагаю, что проблема может быть связана с выделением памяти

Добавлено через 10 минут
Понял, ошибка в строчке: CString a=CString();
Почему нельзя вызывать конструктор без аргументов??
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.12.2019, 23:53
Ответы с готовыми решениями:

Почему в списке инициализации конструктора дочернего класса нельзя вызывать конструктор родительского через его пространство имён?
Есть класс D и от него порождён класс Wd Тут вот например всё работает корректно (использую...

Создание метода без класса и аргументов разве нельзя ?
Всем доброго времени суток. А разве нельзя создать обычный метод под main без аргументов типа того...

Пустой конструктор без аргументов
Всем доброго времени суток. Я сейчас в процессе изучения С++, читаю книгу Лафоре...

Почему нельзя так делать? Конструктор перемещения?
У меня возникла проблема с хранением объектов класса в векторе векторов, объявленном в другом...

1
Мозгоправ
1744 / 1038 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
04.12.2019, 01:05 2
Цитата Сообщение от Ouou12 Посмотреть сообщение
На Visual Studio все работает
Не работает.
Цитата Сообщение от Ouou12 Посмотреть сообщение
Понял, ошибка в строчке: CString a=CString();
Не угадали.
Цитата Сообщение от Ouou12 Посмотреть сообщение
В чем может быть ошибка?
В конструкторе (любом) все члены класса должны быть инициализированы. Ваш конструктор без параметров не инициализирует поле length. А вылетает в строке 101 при выходе заграницу выделенной памяти.

Ещё у вас память течёт. Из-за неправильного объявления оператора +. Должно быть так:
C++
1
friend CString operator+ (const CString& left, const CString& right);
0
04.12.2019, 01:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.12.2019, 01:05
Помогаю со студенческими работами здесь

Как написать конструкторы копирования, инициализации и конструктор без аргументов?
Как написать конструкторы копирования, инициализации и конструктор без аргументов? Вот код ...

Почему в абстрактном классе можно вызвать конструктор но объект создать нельзя?
class A { protected: std::string str; public: A(std ::string s) :str(s) { std::cout &lt;&lt;...

Почему нельзя в конструкторе использовать параметр по умолчанию, если конструктор не встроен?
То есть честно говоря, вопрос так надо ставить: почему если конструктор встроенный, то можно...

Почему возникает ошибка в функциях без реализации, без входящих аргументов
Доброго времени суток. Работаю с движком unreal engine. Дано: 1. Заголовочный файл(.h) и...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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