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

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

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

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

01.08.2009, 12:55. Просмотров 952. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2009, 12:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование и конструктор. (C++):

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

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

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

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

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

Конструктор. Наследование. Список инициализации - C++
Если есть класс, который наследует другой класс, то как задать для конструктора список инициализации? class CKub { private: ...

4
schdub
2955 / 1300 / 239
Регистрация: 19.01.2009
Сообщений: 3,414
Завершенные тесты: 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;
}
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
0
insolent
826 / 344 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
01.08.2009, 13:57  [ТС] #4
polivets, вы не правильно поняли логику, нужно на основе класса String, нужно реализовать предотвращения переполнения буфера через наследование.

zim22, но даже если так сделать, то картина не меняется.
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
01.08.2009, 15:43 #5
Цитата Сообщение от insolent Посмотреть сообщение
Проблема в том, что не выводится значение s2.
оно выводится. просто оно равно пустой строке.
***
отладчиком пользуйтесь.
0
01.08.2009, 15:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2009, 15:43
Привет! Вот еще темы с ответами:

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования - C++
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных задаются длины трех сторон треугольника. Класс...

this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) - C++
class Test { int i; public: void test(int i) { this -&gt; i = i; } }; Конструктор Test::Test всегда вызывается...

Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром? - C++
Добрый день, сразу к делу, есть некий класс class some { int x; public: some(int y = 1) : x(y) {} };

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно» - C++
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по умолчанию, конструктор с параметрами....


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

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

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