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

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

Войти
Регистрация
Восстановить пароль
 
iNsomNia7
2 / 2 / 0
Регистрация: 19.11.2012
Сообщений: 32
#1

Строки, наследование - C++

14.09.2013, 18:40. Просмотров 408. Ответов 6
Метки нет (Все метки)

Задача:
Вспомните пример STRCONV из главы 8. Класс String в этом примере имеет дефект: у него нет защиты на тот случай, если его объекты будут инициа- лизированы слишком длинной строкой (константа SZ имеет значение 80). Например, определение
String s = "Эта строка имеет очень большую длину и мы можем быть уверены, что она не уместится в отведенный буфер, что приведет к непредсказуемым последствиям.";
будет причиной переполнения массива str строкой s с непредсказуемыми последствиями вплоть до краха системы.
Создадим класс Pstring, производный от класса String, в котором предот- вратим возможность переполнения буфера при определении слишком длинной строковой константы. Новый конструктор производного класса будет копировать в str только SZ-1 символов, если строка окажется слиш- ком длинной, и будет копировать строку полностью, если она будет иметь длину меньшую, чем SZ. Напишите функцию main() программы для про- верки ее работы со строками разной длины.
Мое решение:

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
//9-2.cpp
#include <iostream>
#include <cstring>
using namespace std;
 
const int SZ = 80;
 
class String
{
protected:
    char stroka[SZ];
public:
    String()
    { stroka[0] = '\0'; }
    String(char a[])
    { strcpy(stroka, a);}
    void getstring()
    {
        cout << "Enter the string: ";
        cin >> stroka;
    }
    void disp() const
    {
        cout << "String: " << stroka << endl;
    }
};
 
class Pstring: public String
{
public:
    Pstring(char b[])
    { 
        if(strlen(b) > SZ -1)
        {
            for(int j = 0; j < SZ - 1; j++)
            {
                stroka[j] = b[j];
            }
            stroka[SZ - 1] = '\0';
        }
        else
            String(b);
    }
};
 
void main()
{
    Pstring s1 = "It's very long string, which may be, yes, no, just larger then SZ = 80!!aaaaaaaaaadfgdfgdfgdfgdfgdgdfgd";
    s1.disp();
    Pstring s2 = "Eto norma!";
    s2.disp();
    system("pause");
}
Не могу понять почему не считывается короткая строка, помогите, пожалуйста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2013, 18:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Строки, наследование (C++):

Наследование\строки - C++
В некоторых компьютерных языках, таких, как Visual Basic, есть опера- ции, с помощью которых можно выделить часть строки и присвоить ее ...

Закрытое наследование. Вывод строки - C++
Здравствуйте. Необходимо вывести элемент класса std::string в данном случае: class Wine : protected Pair, private string { int...

Заменить наследование классов на наследование интерфейсов - C++
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int people_on_base = 100; int vehicles_on_base = 100; double...

наследование в С++ - C++
Добрый вечер. относительно недавно мною была получена задача, а точнее несколько задач в одной...И как это ни печально звучит, проблемы...

Наследование - C++
Помогите пожалуйста вот с такой задачей: Надо создать класс треугольник. Вводим три стороны и находим периметр и градусы углов. Потом...

наследование - C++
во всех подклассах выдает одну и ту же ошибку, что я делаю не так? #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;typeinfo&gt; ...

6
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
14.09.2013, 18:58 #2
C++
1
2
3
4
5
6
7
void main()
{
    Pstring s1("qwer");
    s1.getstring();
    s1.disp();
    system("pause");
}
Все считывается. В чем конкретно проблема?
0
iNsomNia7
2 / 2 / 0
Регистрация: 19.11.2012
Сообщений: 32
14.09.2013, 19:05  [ТС] #3
Цитата Сообщение от ViktorKozlov Посмотреть сообщение
C++
1
2
3
4
5
6
7
void main()
{
    Pstring s1("qwer");
    s1.getstring();
    s1.disp();
    system("pause");
}
Все считывается. В чем конкретно проблема?
Функция getstring() для решения задачи не нужна, написал на автомате.
Мне необходимо, чтобы объект инициализировался значением "Eto norma" при создании, значит проблема где-то в конструкторе, а найти ее самостоятельно не могу
0
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
14.09.2013, 19:09 #4
C++
1
2
else
    String(b);
Что это?
0
iNsomNia7
2 / 2 / 0
Регистрация: 19.11.2012
Сообщений: 32
14.09.2013, 19:17  [ТС] #5
Цитата Сообщение от ViktorKozlov Посмотреть сообщение
Что это?
Если строка меньше 80 символов, то используем конструктор базового класса String с одним аргументом типа char[]
0
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
14.09.2013, 19:22 #6
Конструктор базового класса можно использовать только в списке инициализации
C++
1
2
3
Pstring(char b[]):String(b)
    { 
        //...
но в вашем случае это не подойдет, так как тогда не получится сделать предварительную проверку, а конструктор базового класса вызывается всегда в первую очередь.
У вас же это просто создание временного объекта String, которое не несет никакой смысловой нагрузки
1
iNsomNia7
2 / 2 / 0
Регистрация: 19.11.2012
Сообщений: 32
14.09.2013, 19:30  [ТС] #7
Цитата Сообщение от ViktorKozlov Посмотреть сообщение
Конструктор базового класса можно использовать только в списке инициализации
C++
1
2
3
Pstring(char b[]):String(b)
    { 
        //...
но в вашем случае это не подойдет, так как тогда не получится сделать предварительную проверку, а конструктор базового класса вызывается всегда в первую очередь.
У вас же это просто создание временного объекта String, которое не несет никакой смысловой нагрузки
Заменил на

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Pstring(char b[])
    { 
        if(strlen(b) > SZ -1)
        {
            for(int j = 0; j < SZ - 1; j++)
            {
                stroka[j] = b[j];
            }
            stroka[SZ - 1] = '\0';
        }
        else
            strcpy(stroka, b);
    }
Теперь все работает, спасибо большое
0
14.09.2013, 19:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2013, 19:30
Привет! Вот еще темы с ответами:

наследование - C++
Всем привет.Проблема в том, что у меня не сравниваются числа в классе Fraction.Я просто не знаю,как правильно это сделать.Подскажите...

Наследование - C++
Помогите найти ошибку,не выводит на экран данные,Задание: Разработать программу с использованием наследования классов, реализую-щую...

Наследование?! - C++
привет всем. Есть класс Circle c1, c2, c3 Нужно реализовать через наследование класс множество, прошу помочь как он будет выглядеть...

наследование - C++
помогите пожалуйсто дописать класс многоугольников , и рисовать на монитор с помощью mfc , заранее благодарен... class figure{ public: ...


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

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

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