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

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

Войти
Регистрация
Восстановить пароль
 
superNOOB
3 / 3 / 0
Регистрация: 04.10.2013
Сообщений: 37
#1

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

15.06.2014, 19:38. Просмотров 357. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2014, 19:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка базового класса строки (C++):

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

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

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

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

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

Реализовать оператор= для присваивания объекта класса-потомка объекту базового класса - C++
Есть два класса A и B, причем класс B является потомком A. Как реализовать следующее: obj_A = obj_B и obj_B = obj_A? Добавлено через 9...

10
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
15.06.2014, 19:59 #2
Цитата Сообщение от superNOOB Посмотреть сообщение
Есть код и есть ошибки
Код видно. А ошибки?
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3139 / 307
Регистрация: 04.12.2011
Сообщений: 8,661
Записей в блоге: 5
15.06.2014, 20:03 #3
Цитата Сообщение от 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
superNOOB
3 / 3 / 0
Регистрация: 04.10.2013
Сообщений: 37
15.06.2014, 20:21  [ТС] #4
ошибки в начале каждого определения конструктора в mystring.cpp

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

Добавлено через 3 минуты
Цитата Сообщение от Tulosba Посмотреть сообщение
А ошибки
Ошибки в определении конструкторов, в строчках подобного типа
C++
1
mystring():p(0),length(0){}
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3139 / 307
Регистрация: 04.12.2011
Сообщений: 8,661
Записей в блоге: 5
15.06.2014, 20:23 #5
Цитата Сообщение от superNOOB Посмотреть сообщение
ошибки в начале каждого определения конструктора
Правильно. Нужно разрешением доступа пользоваться вне класса:
C++
1
2
3
mystring::mystring(){
//----------
}
А ссылки зачем? Лучше скопируйте сообщение компилятора в пост.
1
superNOOB
3 / 3 / 0
Регистрация: 04.10.2013
Сообщений: 37
15.06.2014, 21:04  [ТС] #6
Цитата Сообщение от IGPIGP Посмотреть сообщение
А ссылки зачем? Лучше скопируйте сообщение компилятора в пост
||=== Build: Debug in Karkarkar (compiler: GNU GCC Compiler) ===|
C:\Users\Ho-ho-ho\Desktop\Karkarkar\mystring.cpp|19|warning: multi-character character constant [-Wmultichar]|
C:\Users\Ho-ho-ho\Desktop\Karkarkar\mystring.cpp|27|warning: multi-character character constant [-Wmultichar]|
C:\Users\Ho-ho-ho\Desktop\Karkarkar\mystring.cpp|12|error: expected unqualified-id before ')' token|
C:\Users\Ho-ho-ho\Desktop\Karkarkar\mystring.cpp|15|error: expected unqualified-id before 'const'|
C:\Users\Ho-ho-ho\Desktop\Karkarkar\mystring.cpp|15|error: expected ')' before 'const'|
C:\Users\Ho-ho-ho\Desktop\Karkarkar\mystring.cpp|22|error: expected unqualified-id before 'const'|
C:\Users\Ho-ho-ho\Desktop\Karkarkar\mystring.cpp|22|error: expected ')' before 'const'|
C:\Users\Ho-ho-ho\Desktop\Karkarkar\mystring.cpp|41|error: 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
Комп_Оратор)
Эксперт по математике/физике
6503 / 3139 / 307
Регистрация: 04.12.2011
Сообщений: 8,661
Записей в блоге: 5
15.06.2014, 23:09 #7
Цитата Сообщение от superNOOB Посмотреть сообщение
Так? Тогда что-то не то выходит
Не-а. Выделить память только под терминатор вы сами придумали. Про полное имя правильно поняли. В классе нужно объявить, а за пределами определить с полным именем.
0
superNOOB
3 / 3 / 0
Регистрация: 04.10.2013
Сообщений: 37
16.06.2014, 00:06  [ТС] #8
Цитата Сообщение от IGPIGP Посмотреть сообщение
В классе нужно объявить, а за пределами определить с полным именем.
?
можно строчку для примера, пожалуйста, если вам не сложно
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3139 / 307
Регистрация: 04.12.2011
Сообщений: 8,661
Записей в блоге: 5
16.06.2014, 01:15 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от superNOOB Посмотреть сообщение
?
можно строчку для примера, пожалуйста, если вам не сложно
В конструкторе преобразования к char вы сами написали полное имя, зачем же вам пример? Непонятно зачем остальные конструктора записаны как свободные функции. У них нет типа возврата и компилятор в мучениях, да и имя занято классом. Везде полное имя напишите.
1
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.06.2014, 08:06 #10
superNOOB, класс строки.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3139 / 307
Регистрация: 04.12.2011
Сообщений: 8,661
Записей в блоге: 5
16.06.2014, 14:30 #11
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
16.06.2014, 14:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2014, 14:30
Привет! Вот еще темы с ответами:

Как построить экземпляр дочернего класса на основе готового экземпляра базового класса? - C++
Если уже есть готовый объект базового класса. Могу я построить экземпляр дочернего на его основе, (напр., получив такой базовый объект...

Определить обработчик исключений на преобразование указателя базового класса на указатель производного класса - C++
Класс В является производным от класса А. Определить обработчик исключительной ситуации на преобразование указателя базового класса А на...

Поместить в динамически расширяемый массив объекты класса, производные от базового абстрактного класса - C++
Помогите пожалуйста новичку! (мне). Я хочу создать динамически расширяющийся массив указателей на базовый абстрактный класс,...

Создать массив указателей базового класса и присвоить ему адреса каждого из екземпляров класса - C++
Всем привет. Есть условие задачи: Дан базовый класс Base у которого есть метод my_name, метод выводит сообщение This is Base class. От...


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

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

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