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

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

Войти
Регистрация
Восстановить пароль
 
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
#1

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

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

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

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

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

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

Конструктор - C++
Какие числа выведет если убрать cin &gt;&gt; x &gt;&gt; y; #include &lt;stdlib.h&gt; #include &lt;iostream&gt; using namespace std; class myclass { ...

Конструктор new - C++
#include &quot;stdafx.h&quot; #include &lt;string&gt; #include &lt;iostream&gt; using namespace std; class IoString{ public: string str; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
schdub
2945 / 1289 / 238
Регистрация: 19.01.2009
Сообщений: 3,366
Завершенные тесты: 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
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
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
01.08.2009, 13:57  [ТС]     Наследование и конструктор. #4
polivets, вы не правильно поняли логику, нужно на основе класса String, нужно реализовать предотвращения переполнения буфера через наследование.

zim22, но даже если так сделать, то картина не меняется.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2009, 15:43     Наследование и конструктор.
Еще ссылки по теме:

Конструктор - C++
Привет всем. Есть тут трудность: изучаю по книжке классы,содержащие другие классы. Есть пример, но в одном месте текст размыт. Похоже что...

Конструктор - C++
Скажите, как правлиьно оформить конструктор в этом коде? struct Student { public: Student(Student *s) { cout &lt;&lt;...

Конструктор - C++
Вот что получилось. программа работает. компилируется, но вылетает во время работы. В чем дело? #include &lt;iostream.h&gt; class vector...

Конструктор - C++
Объясните, пожалуйста, как работает этот код: PhoneBook::PhoneBook(const std::string &amp; filename_ ):filename(filename_){} Весь код...


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

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

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