С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
3 / 3 / 0
Регистрация: 04.10.2013
Сообщений: 37

Ошибка базового класса строки

15.06.2014, 19:38. Показов 1445. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код и есть ошибки в mystring.cpp, помогите пожалуйста исправить

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
/*----------------/
 mystring.h
/---------------*/
 
#ifndef MYSTRING_H
#define MYSTRING_H
 
 
class mystring    //базовый класс строки
{
protected:
    char *p;    // Указатель на char - хранит адрес динамически выделенной памяти для размещения символов строки
    int length;    // Значение типа int - хранит длину строки в байтах
public:    // Обязательные методы должны выполнять следующие действия:
    mystring();    // Конструтор без параметров
    mystring(const char *s);    // Конструктор, принимающий в качестве параметра Си-строку (заканчивается нулевым байтом)
    mystring(char c);        // Конструктор, принимающий в качестве параметра символ (char)
    mystring(const mystring &str);    // Конструктор копирования
    ~mystring();    // Деструктор
    int get_length();    // Получение длины строки
};
 
#endif // MYSTRING_H
 
 
 
/*
Описать базовый класс СТРОКА.
Обязательные члены класса :
* указатель на char - хранит адрес динамически выделенной памяти
для размещения символов строки;
* значение тип int - хранит длину строки в байтах .
 
Обязательные методы должны выполнять следующие действия:
* конструктор без параметров;
Конструктор, принимающий в качестве параметра:
    * Си-строку (заканчивается нулевым байтом);
    * конструктор, принимающий в качестве параметра символ (char).
    * конструктор копирования;
* деструктор.
* получение длины строки;
*/
 
/*----------------/
 mystring.cpp
/---------------*/
 
#include "include/mystring.h"
 
using namespace std;
 
 
 
//конструктор без параметров
mystring():p(0),length(0){}
 
//конструктор принимает строку текста
mystring( const char* str)
{length=strlen(str);
p=new char[length+1];
for (int i=0; i<length; i++) p[i]=str[i];
p[length]='/0';
}
//конструктор копирования
mystring (const mystring& T)
{length=T.length;
p=new char [length+1];
for (int i=0;i<length;i++)
p[i]=T.p[i];
p[length]='/0';
}
 
 
//конструктор принимающий в качестве параметра символ (char)
mystring::mystring(char c)
{
length=2;
    p = new char[length];
    p[0]=c;
    p[1]='\0';
}
 
//Деструктор
virtual ~mystring()
{if(p)delete[]p;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.06.2014, 19:38
Ответы с готовыми решениями:

Ошибка. В классе наследнике все элементы, которые были унаследованы от базового класса
выполняя лабу для института, столкнулся с интересной штукой: компилятор выдает, что в классе наследнике все элементы, которые были...

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

Как сложить объект базового класса с объектом производного(наследуемого класса)
Как умножить объект базового класса с объектом производного(наследуемого класса): ozenka - объект базового класса, а ves- производного ...

10
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.06.2014, 19:59
Цитата Сообщение от superNOOB Посмотреть сообщение
Есть код и есть ошибки
Код видно. А ошибки?
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
15.06.2014, 20:03
Цитата Сообщение от superNOOB Посмотреть сообщение
C++
1
mystring( const char* str) {length=strlen(str); p=new char[length+1]; for (int i=0; i<length; i++) p[i]=str[i]; p[length]='/0';
}
Можно бы проверить указатель на 0 и освободить память, если он куда-то указывает. Иначе при новом выделении "старая" память утечёт. Но лучше бы хранить длину массива полученную при очередном выделении и сравнивать с длиной присваеваемой строки и если помещается вообще не удалять и превыделять. А если не помещается, то перевыделять и апдейтить длину массива. Длину строки можно не хранить, она ридонли и всегда может быть возвращена strlen().
И да, - ошибки покажите.
0
3 / 3 / 0
Регистрация: 04.10.2013
Сообщений: 37
15.06.2014, 20:21  [ТС]
ошибки в начале каждого определения конструктора в mystring.cpp



Добавлено через 3 минуты
Цитата Сообщение от Tulosba Посмотреть сообщение
А ошибки
Ошибки в определении конструкторов, в строчках подобного типа
C++
1
mystring():p(0),length(0){}
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
15.06.2014, 20:23
Цитата Сообщение от superNOOB Посмотреть сообщение
ошибки в начале каждого определения конструктора
Правильно. Нужно разрешением доступа пользоваться вне класса:
C++
1
2
3
mystring::mystring(){
//----------
}
А ссылки зачем? Лучше скопируйте сообщение компилятора в пост.
1
3 / 3 / 0
Регистрация: 04.10.2013
Сообщений: 37
15.06.2014, 21:04  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
А ссылки зачем? Лучше скопируйте сообщение компилятора в пост
||=== Build: Debug in Karkarkar (compiler: GNU GCC Compiler) ===|
C:\Users\Ho-ho-ho\Desktop\Karkarkar\mystring.cpp|19|war ning: multi-character character constant [-Wmultichar]|
C:\Users\Ho-ho-ho\Desktop\Karkarkar\mystring.cpp|27|war ning: multi-character character constant [-Wmultichar]|
C:\Users\Ho-ho-ho\Desktop\Karkarkar\mystring.cpp|12|err or: expected unqualified-id before ')' token|
C:\Users\Ho-ho-ho\Desktop\Karkarkar\mystring.cpp|15|err or: expected unqualified-id before 'const'|
C:\Users\Ho-ho-ho\Desktop\Karkarkar\mystring.cpp|15|err or: expected ')' before 'const'|
C:\Users\Ho-ho-ho\Desktop\Karkarkar\mystring.cpp|22|err or: expected unqualified-id before 'const'|
C:\Users\Ho-ho-ho\Desktop\Karkarkar\mystring.cpp|22|err or: expected ')' before 'const'|
C:\Users\Ho-ho-ho\Desktop\Karkarkar\mystring.cpp|41|err or: declaration of '~mystring' as non-member|
||=== Build failed: 6 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===|

Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
Правильно. Нужно разрешением доступа пользоваться вне класса:
C++
1
2
3
4
mystring::mystring(){
p= new length[1];
    p[0] = '\0';
}
Так? Тогда что-то не то выходит
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
15.06.2014, 23:09
Цитата Сообщение от superNOOB Посмотреть сообщение
Так? Тогда что-то не то выходит
Не-а. Выделить память только под терминатор вы сами придумали. Про полное имя правильно поняли. В классе нужно объявить, а за пределами определить с полным именем.
0
3 / 3 / 0
Регистрация: 04.10.2013
Сообщений: 37
16.06.2014, 00:06  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
В классе нужно объявить, а за пределами определить с полным именем.
?
можно строчку для примера, пожалуйста, если вам не сложно
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.06.2014, 01:15
Лучший ответ Сообщение было отмечено superNOOB как решение

Решение

Цитата Сообщение от superNOOB Посмотреть сообщение
?
можно строчку для примера, пожалуйста, если вам не сложно
В конструкторе преобразования к char вы сами написали полное имя, зачем же вам пример? Непонятно зачем остальные конструктора записаны как свободные функции. У них нет типа возврата и компилятор в мучениях, да и имя занято классом. Везде полное имя напишите.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.06.2014, 08:06
superNOOB, класс строки.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.06.2014, 14:30
Лучший ответ Сообщение было отмечено superNOOB как решение

Решение

superNOOB, вот вариант. Не подумайте что это лучше чем у Forever)
Особенно, важно понять, что конструктор копии нужен для передачи/ возврата и инициализации объектом, поэтому копия всегда отбрасывается и память там перевыделять (удалять прежнюю) не стоит. Поэтому нужно обязательно определить оператор присваивания, где перевыделяя память вы работаете с самим оригиналом и не можете повредить источник.
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
#include<iostream>
#include<cstring>
#include<cstdlib>
 
using namespace std;
 
class C_str{
char *pCh;
 
public:
C_str();
C_str( const char *p);
C_str( const C_str &rhs);
C_str( const char ch);
char *get_str()const;
int get_len()const;
void print_str()const;
const C_str &operator=(const C_str &p);
~C_str();
};
 
//-----
char *C_str::get_str()const{
return pCh;
}
C_str::C_str(){
pCh = new char[1];
pCh[0] = '\0';
}
//----------
C_str::C_str( const char *p){
pCh = new char[strlen(p)+1];
strcpy(pCh, p);
}
//---------
C_str::C_str( const C_str &rhs){
    if(rhs.get_str()){
pCh = new char[strlen(rhs.get_str())+1];
strcpy(pCh, rhs.get_str());
    }else pCh = 0;
}
//---------
const C_str &C_str::operator=(const C_str &rhs){
if(&rhs == this) return *this;
 
if(&rhs && rhs.get_str()){
    if(pCh){
delete []pCh;
pCh=0;
}
pCh = new char[strlen(rhs.get_str())+1];
strcpy(pCh, rhs.get_str());
}
else
pCh=0;
return *this;
}
//--------
C_str::C_str( const char ch){
pCh = new char[2];
pCh[0] = ch;
pCh[1] = '\0';
}
//--------
C_str::~C_str(){
if(pCh)delete []pCh;
}
//-------
void C_str::print_str()const{
if(pCh)cout << pCh << endl;
else
cout << "Null pointer at C_str!" << endl;
}
//---------------
int C_str::get_len()const{
if(pCh)return strlen(pCh);
return 0;
}
int main(){
C_str first_str("qwerty");//преобр к char*
first_str.print_str();
C_str second_str('A');//преобр к ch
second_str.print_str();
second_str = first_str;//operator=
second_str.print_str();
C_str third_str(first_str);//копия
third_str.print_str();
cout << third_str.get_len() << endl;//возвращаем длину (есть только геттер потому как только для чтения)
system("pause");
cout<<endl;
return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.06.2014, 14:30
Помогаю со студенческими работами здесь

Вызов метода производного класса через обращение к методу базового класса
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp, то всё нормально. Если же создавать в...

Создание указателя типа базового класса на экземпляр производного класса
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса - наследника, для чего это может применяться?

Возможно ли указатель производного класса инициализировать объектом базового класса?
имеется связка наследуемых классов A-&gt;B а от B наследуются одновременно еще два класса B-&gt;C и B-&gt;D class A { public: ...

Перегрузка оператора >> для дочернего класса от базового виртуального класса
Доброго вам времени суток! Программирую на С++ не давно, в связи с отсутствием должного времени на поиск ответа в глубинах учебников,...

Указатель на объект базового класса и адрес объекта производного класса
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; } ~Class1() {delete j;}


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru