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

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

Восстановить пароль Регистрация
 
superNOOB
3 / 3 / 0
Регистрация: 04.10.2013
Сообщений: 37
15.06.2014, 19:38     Ошибка базового класса строки #1
Есть код и есть ошибки в 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.06.2014, 19:59     Ошибка базового класса строки #2
Цитата Сообщение от superNOOB Посмотреть сообщение
Есть код и есть ошибки
Код видно. А ошибки?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6159 / 2888 / 282
Регистрация: 04.12.2011
Сообщений: 7,686
Записей в блоге: 3
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().
И да, - ошибки покажите.
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){}
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6159 / 2888 / 282
Регистрация: 04.12.2011
Сообщений: 7,686
Записей в блоге: 3
15.06.2014, 20:23     Ошибка базового класса строки #5
Цитата Сообщение от superNOOB Посмотреть сообщение
ошибки в начале каждого определения конструктора
Правильно. Нужно разрешением доступа пользоваться вне класса:
C++
1
2
3
mystring::mystring(){
//----------
}
А ссылки зачем? Лучше скопируйте сообщение компилятора в пост.
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';
}
Так? Тогда что-то не то выходит
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6159 / 2888 / 282
Регистрация: 04.12.2011
Сообщений: 7,686
Записей в блоге: 3
15.06.2014, 23:09     Ошибка базового класса строки #7
Цитата Сообщение от superNOOB Посмотреть сообщение
Так? Тогда что-то не то выходит
Не-а. Выделить память только под терминатор вы сами придумали. Про полное имя правильно поняли. В классе нужно объявить, а за пределами определить с полным именем.
superNOOB
3 / 3 / 0
Регистрация: 04.10.2013
Сообщений: 37
16.06.2014, 00:06  [ТС]     Ошибка базового класса строки #8
Цитата Сообщение от IGPIGP Посмотреть сообщение
В классе нужно объявить, а за пределами определить с полным именем.
?
можно строчку для примера, пожалуйста, если вам не сложно
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6159 / 2888 / 282
Регистрация: 04.12.2011
Сообщений: 7,686
Записей в блоге: 3
16.06.2014, 01:15     Ошибка базового класса строки #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от superNOOB Посмотреть сообщение
?
можно строчку для примера, пожалуйста, если вам не сложно
В конструкторе преобразования к char вы сами написали полное имя, зачем же вам пример? Непонятно зачем остальные конструктора записаны как свободные функции. У них нет типа возврата и компилятор в мучениях, да и имя занято классом. Везде полное имя напишите.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.06.2014, 08:06     Ошибка базового класса строки #10
superNOOB, класс строки.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2014, 14:30     Ошибка базового класса строки
Еще ссылки по теме:

C++ Создать массив указателей базового класса и присвоить ему адреса каждого из екземпляров класса
Вызов конструктора базового класса из класса-наследника C++
Конструктор базового класса C++

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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6159 / 2888 / 282
Регистрация: 04.12.2011
Сообщений: 7,686
Записей в блоге: 3
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;
}
Yandex
Объявления
16.06.2014, 14:30     Ошибка базового класса строки
Ответ Создать тему
Опции темы

Текущее время: 21:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru