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

Наследование!За что мне всё это!? - C++

Восстановить пароль Регистрация
 
stawerfar
 Аватар для stawerfar
140 / 54 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
16.04.2011, 13:35     Наследование!За что мне всё это!? #1
Доброго времени суток уважаемые форум_чане! Занимаясь по Лафоре столкнулся с такой проблемой Вот частный случай! Задача 8 9 глава:
".... Используя наследование добавьте такую возможность в класс "
C++
1
2
3
s2.left(s1,n)// в строчку s2 помещаются n самых левых символов строки s1
s2.mid(s1,s,n)// в строчку s2 помещаются n символов из строки s1 начиная с символа номер s 
s2.right(s1,n)//в строку s2  помещаются n самых правых символов строки s1
Задача не трудная я даже скажу что она проще париной репы! Но выполняя это задание заметил один косяк!!!!По условию мне нужно менять сам массив объекта
s2. Это можно сделать разными альтернативными способами! Вот например можно непосредственно работать с массивом s2 или создать временный объект и присвоить значение массива временного объекта массиву s2!
Вот только в тарой способ не работает!Я его реализую помощью конструктора и когда просматриваю по шагам то почему то вместо конструктора с одним аргументом вызывается конструктор без параметров!
Вот код
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include<iostream>
using namespace std;
#include<string>
//***************************************************************************************************************************
//базовый класс String
class String
{
    protected:
        enum{MAX=10};
    
        char mas[MAX];
    public:
        
    String()// ВОТ СЮДА ЗАХОДИТ!!!
    {mas[0]='\0';}
     String(char mas1[])// В МЕСТО ЭТОГО!!!
    {
         strcpy(mas,mas1);
    }
        
        inline void get_char()const//вывод на экран
        {
            cout<<mas<<endl;
        }
        operator char*()//преобразование от string в String
        {return mas;}
        inline void put_char()//ввод данных пользователем
        {
            cout<<"Введите строку : ";
            cin.get(mas,MAX-1);
        }
 
};
//***************************************************************************************************************************
// производный клас Pstring от String
class Pstring : public String
{
    public:
        Pstring():String()
        {}
        Pstring(char mas1[])//здесь проверяю что бы не было выхода за придел
        {int n=strlen(mas1);// массива
            if(n<MAX-1)
            {
                String(mas1);
            }
            else
            {
                
                    for(int i=0;i<MAX-1;i++)
                    {
                        mas[i]=mas1[i];
                    }
                    mas[i]='\0';
                
            }
        
        }
        inline void put_char()//ввод данных пользователем
        {
            cout<<"Введите строку : ";
            cin.get(mas,MAX-1);
        }
};
//***************************************************************************************************************************
// производный Pstring2 от Pstring
class Pstring2 : public Pstring
{
    public:
        Pstring2(): Pstring()
        {}
        Pstring2(char mas1[]):Pstring(mas1)
        {}
        inline Pstring2 left(Pstring2 const& value,int const& number_simvol_sum);//помещает n самых левых символов в строку
        inline Pstring2 mid(Pstring2 const& value,int const& at_first_simvol,int const& number_simvol_sum);//помещает n символов из строки начиная с at_first_simvol
        inline Pstring2 right(Pstring2 const& vlue,int const& number_simvol_sum);//помещает n самых правых символов в строку
};
//********************
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//косяк здесь если я как и в других методах буду работать с  массивом s2 то все //нормально но я хочу получить так допустим s2=s2.left(s1,n) 
// посмотрите по шагам почему в этом случае вызывается не тот конструктор??? 
//методы Pstring2
inline Pstring2 Pstring2::left(Pstring2 const& value,int const& number_simvol_sum)
{
    Pstring2 result;
    if(number_simvol_sum <MAX)//проверка на выход за границы массива
    {
        for(int i=0;i<number_simvol_sum;i++)
        {
        result.mas[i]=value.mas[i];
        }
        result.mas[i]='\0';
    }
    else
    {
        for(int i=0;i<MAX-1;i++)// если верх false то заполняем масив символами сколько в лезит с учетом границ
        {
            result.mas[i]=value.mas[i];
        }
        result.mas[i]='\0';
    }
    return Pstring2(result.mas);
}
//*********************
inline Pstring2 Pstring2:: mid(Pstring2 const& value,int const& at_first_simvol,int const& number_simvol_sum)
{
 
    if(number_simvol_sum <MAX)//проверка на выход за границы массива
    {
        for(int i=0;i<number_simvol_sum;i++)
        {
            mas[i]=value.mas[i+at_first_simvol];
        }
        mas[i]='\0';
    }
    else
    {
        for(int i=at_first_simvol;i<MAX-1;i++) // если верх false то заполняем масив символами сколько в лезит с учетом границ
        {mas[i]=value.mas[i+at_first_simvol];}
        mas[i]='\0';
    }
    return Pstring2(mas);
}
//**********************
inline Pstring2 Pstring2::right(Pstring2 const& vlue,int const& number_simvol_sum)
{
    int n=strlen(vlue.mas);
    //Pstring2 result;
    if(number_simvol_sum <MAX)//проверка на выход за границы массива
    {   
        for(int i=0;i<number_simvol_sum;i++)
        {
            mas[i]= vlue.mas[(n-number_simvol_sum)+i];
        }
        mas[i]='\0';
    }
    else
    {
        for(int i=0;i<MAX-1;i++)// если верх false то заполняем масив символами сколько в лезит с учетом границ
        {
            mas[i]= vlue.mas[(n-number_simvol_sum)+i];
        }
        mas[i]='\0';
    }
    return Pstring2(mas);
}
//***************************************************************************************************************************
// main()
int main(void)
{   
 
    class Pstring2 one("Stanislav"),two,three,four,five,nuw;
 
    nuw=two.left(one,5);
    two=two.left(one,5);
    three.mid(one,5,3);
    four.right(one,3);
    five=one;
    five.left(one,5);
    cout<<"one :";one.get_char();
    cout<<"two :";two.get_char();
    cout<<"three :";three.get_char();
    cout<<"four :";four.get_char();
    cout<<"five :";five.get_char();
    cout<<"nuw :";nuw.get_char();
    
 
    system("pause");
return 0;
}
Если я в чем то не прав объясните как это работает или должно работать!
Потому что Лафоре явно не очень сильно описывает тонкости таких вещей!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2011, 13:35     Наследование!За что мне всё это!?
Посмотрите здесь:

сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь усложнять? C++
this это адресс объекта, а *this это сам объект. я всё правельно понял? C++
C++ Объясните человеческим языком мне чайнику что такое singleton, статический класс. Зачем они нужны. Что рекомендуете прочитать мне для начала
Что это за знак >> прочитал что это сдвиг вправо? что он делает C++
Полиморфизм и наследование - что это? C++
Наследование, так ли это C++
К знатокам С++: это самодостаточный язык, или всё таки он зависит от Си C++
Всё компилируется, выводится, но не то что мне нужно C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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