Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
827 / 349 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
1

Наследование и конструктор.

01.08.2009, 12:55. Просмотров 1115. Ответов 4
Метки нет (Все метки)

Вот
код
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
#include <iostream> 
#include <string> 
using namespace std;
class String //базовый класс 
{ 
protected:  
    enum {SZ = 80 }; //размер всех объектов String 
    char str [SZ]; //содержит С-строку 
public: 
    String() //конструктор без аргументов 
    {str [0] ='\0';} 
    String(char* s) //конструктор c одинм аргументом
    {strcpy(str,s);} //преобразование в String 
    void display()const //вывести String 
    {cout << str;} 
    operator char*() //функция преобразования 
    {return str;} //преобразовать String в C-string 
    };
    class Pstring :public String //порожденный класс 
    { 
    public: 
        Pstring(char* s);
    };
    Pstring::Pstring(char* s) //конструктор для Pstring 
    { 
        if(strlen(s)>SZ-1) //если слишком длинная строка. 
        { 
            int j = 0;
            for(j = 0 ;j<SZ-1;j++) //копировать первые SZ-1 
                str [j] = s [j]; //символы «вручную» 
                str [j] = '\0'; //добавить служебный символ 
        }
        else //если не слишком длинная. 
        {
            String(s); //создать нормальную строку 
        }
    }
int main()
{
    setlocale(0,"");
    Pstring s1 ="Это очень-очень длинная строка, которая, возможно,да, нет. точно, - превысит размер, ограниченный SZ."; 
    cout <<"\nsl=";
    cout << static_cast<char*>(s1) << endl;
    Pstring s2 ="А это коротенькая строка.";
    cout <<"\ns2=";
    s2.display();// пробывал так cout << static_cast<char*>(s2);
    //,но картина не изменилась
    cout << endl;
    getchar();
    return 0;
}
для решения(хоть и примитивное) задачки для предотвращения
возможности переполнения буфера при слишком большой строки.
Проблема в том, что
не выводится
Наследование и конструктор.
значение s2.
Думал, что студия глючит(она выкидывает один варинг - о strcpy()),
но проверил на codepad.org - все ок, только 2 варинга: на преобразования константы в char*.
Помогите исправить.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.08.2009, 12:55
Ответы с готовыми решениями:

Наследование, конструктор класса
Объясните мне пожалуйста, что значит такая конструкция: class CMyPaintDC:public CPaintDC {...

Наследование и конструктор с параметрами
Добрый вечер! При разработке программы столкнулся с проблемой. По условию нужно использовать...

Наследование, перегрузка, конструктор
#include &lt;iostream&gt; class animal { public: animal() { } animal(int a) { age = a; }...

Наследование(Не вызывается конструктор)
f3=f1+f2; 1) Вызывается Fraction operator+(const Fraction&amp; other) 2) Для возвращенного значения...

4
Эксперт С++
3056 / 1398 / 421
Регистрация: 19.01.2009
Сообщений: 3,761
01.08.2009, 13:29 2
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
#include <iostream> 
#include <string> 
using namespace std;
class String //базовый класс 
{ 
protected:  
        enum {SZ = 80 }; //размер всех объектов String 
        char str [SZ]; //содержит С-строку 
public: 
        
        String() //конструктор без аргументов 
        {
                str [0] = '\0';
        } 
        
        String(char* s) //конструктор c одинм аргументом
        {
                int len = strlen(s);
                if (len>SZ-1)
                        len = SZ-1;
                strncpy(str, s, len);
                str [len] = '\0';
        } //преобразование в String
        
        void display()const //вывести String 
        {cout << str;} 
        operator char*() //функция преобразования 
        {
                return str;
        } //преобразовать String в C-string 
};
 
class Pstring : public String //порожденный класс 
{ 
public:
    Pstring(char* s) : String(s) {}; //конструктор для Pstring 
};
 
int main()
{
        setlocale(0,"");
        Pstring s1 ="Это очень-очень длинная строка, которая, возможно,да, нет. точно, - превысит размер, ограниченный SZ."; 
        cout <<"\nsl=";
        cout << static_cast<char*>(s1) << endl;
        Pstring s2 ="А это коротенькая строка.";
        cout <<"\ns2=";
        s2.display();// пробывал так cout << static_cast<char*>(s2);
        //,но картина не изменилась
        cout << endl;
        getchar();
        return 0;
}
0
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
01.08.2009, 13:35 3
Цитата Сообщение от insolent Посмотреть сообщение
но проверил на codepad.org - все ок, только 2 варинга
всё не ок.
cc1plus: warnings being treated as errors
***
хотя да, всё ок. мой инглиш не пёрфект
warning рассматривается как error
0
827 / 349 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
01.08.2009, 13:57  [ТС] 4
polivets, вы не правильно поняли логику, нужно на основе класса String, нужно реализовать предотвращения переполнения буфера через наследование.

zim22, но даже если так сделать, то картина не меняется.
0
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
01.08.2009, 15:43 5
Цитата Сообщение от insolent Посмотреть сообщение
Проблема в том, что не выводится значение s2.
оно выводится. просто оно равно пустой строке.
***
отладчиком пользуйтесь.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2009, 15:43

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Наследование и конструктор без параметров
Здравствуйте, я нашел один листинг в книге Р. Лафоре. Не могу понять синтаксис конструктора. ...

Наследование и конструктор с аргументами по умолчанию
Есть некоторый абстрактный класс &quot;объект&quot;, который наследуют все объекты (код конструктора): ...

Конструктор. Наследование. Список инициализации
Если есть класс, который наследует другой класс, то как задать для конструктора список...

Ромбовидное наследование. Конструктор внука.
если хотите, можете почитать код - он довольно объёмный...но однотипный #include &quot;stdafx.h&quot;...


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

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

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