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

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

Восстановить пароль Регистрация
 
insolent
 Аватар для insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
01.08.2009, 12:55     Наследование и конструктор. #1
Вот
код
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*.
Помогите исправить.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2009, 12:55     Наследование и конструктор.
Посмотрите здесь:

C++ Наследование(Не вызывается конструктор)
Ромбовидное наследование. Конструктор внука. C++
Конструктор C++
C++ Конструктор
Конструктор C++ и new C++
C++ Конструктор
C++ Конструктор
C++ Наследование, конструктор класса
Конструктор. Наследование. Список инициализации C++
Наследование, перегрузка, конструктор C++
Наследование и конструктор с аргументами по умолчанию C++
C++ Конструктор

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
schdub
 Аватар для schdub
2907 / 1251 / 224
Регистрация: 19.01.2009
Сообщений: 3,239
Завершенные тесты: 1
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;
}
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
01.08.2009, 13:35     Наследование и конструктор. #3
Цитата Сообщение от insolent Посмотреть сообщение
но проверил на codepad.org - все ок, только 2 варинга
всё не ок.
cc1plus: warnings being treated as errors
***
хотя да, всё ок. мой инглиш не пёрфект
warning рассматривается как error
insolent
 Аватар для insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
01.08.2009, 13:57  [ТС]     Наследование и конструктор. #4
polivets, вы не правильно поняли логику, нужно на основе класса String, нужно реализовать предотвращения переполнения буфера через наследование.

zim22, но даже если так сделать, то картина не меняется.
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
01.08.2009, 15:43     Наследование и конструктор. #5
Цитата Сообщение от insolent Посмотреть сообщение
Проблема в том, что не выводится значение s2.
оно выводится. просто оно равно пустой строке.
***
отладчиком пользуйтесь.
Yandex
Объявления
01.08.2009, 15:43     Наследование и конструктор.
Ответ Создать тему
Опции темы

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