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

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

Восстановить пароль Регистрация
 
AlexP11223
36 / 37 / 4
Регистрация: 20.04.2011
Сообщений: 288
06.06.2011, 11:10     Наследование\строки #1
задание
В некоторых компьютерных языках, таких, как Visual Basic, есть опера-
ции, с помощью которых можно выделить часть строки и присвоить ее
другой строке. (В стандартном классе string предложены различные под-
ходы.) Используя наследование, добавьте такую возможность в класс
Pstring из упражнения 2. В новом производном классе Pstring2 разместите
три новых функции: left(), mid() и right().
C++
1
2
3
4
5
6
s2.1eft ( s1, n ) // в строку s2 помещаются n саных левых
// символов строки sl
s2.mid ( s1, s, n ) // в строку s2 понещаются n символов из строки
// начиная с сиивола номер s
s2.right ( s1, n ) // в строку s2 помещаются n самых правых
// символов строки s1
Вы можете использовать цикл for для копирования символ за символом
подходящих частей строки s1 во временный объект класса Pstring2, который затем их возвратит. Для получения лучшего результата используйте
в этих функциях возврат по ссылке, чтобы они могли быть использованы
с левой стороны знака «равно» для изменения части существующей строки.

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
class Pstring :public String
{
public:
    Pstring()                  
    {}
    Pstring(char s[]) 
    {
        
        if (strlen(s) > SZ-1)
        {
            int j;
            for (j=0; j<SZ-1; j++)
                str[j]=s[j];
            str[j]='\0';
        }
 
        else
            strcpy(str, s);
 
    }
};
 
class Pstring2 :public Pstring
{
public:
    Pstring2() : Pstring()
    {}
    Pstring2(char s[]) : Pstring(s)
    {}
 
    Pstring2& left(Pstring2 s2, int n)
    {
        Pstring2 s1;
        for(int i=0; i<=n; i++)
            str[i] = s2[i];
         return s1;
    }
 
    Pstring2& mid(Pstring2 s2, int s, int n)
    {
        Pstring2 s1;
        for(int i=s, j=0; j<=n; i++, j++)
            s1[j] = s2[i];
        return s1;
    }
 
    Pstring2& right(Pstring2 s2, int n)
    {
        Pstring2 s1;
        for(int i=strlen(s2.str), j=0; j<=n; i--, j++)
            str[j] = s2[i];
        return s1;
    }
};
 
int main()
   {
      Pstring2 str1, s1;
      s1 = "It's just a boring test string.";
      str1.left(s1, 5);
      str1.display();
      str1.mid(s1, 10, 5);
      str1.display();
      str1.right(s1, 10);
      str1.display();
     
      
 
   return 0;
   }
Почему такой вывод?
[IMG]http://i22.***********/big/2011/0606/d6/52832a117fce0c82440101cb0e946ad6.jpg[/IMG]
Не очень понимаю как реализовать подчеркнутую часть задания. Как можно использовать это с левой стороны от = ?оО особенно "для изменения части существующей строки" непонятно, выше же написано, что функция и так помещает эту строку в s2? Или что за "существующую строка"?

И как я понимаю, кроме возвращения переменной (вроде бы это я сделал?), строка должна присваиваться той строке, из которой вызвана (str1 в данном случае). Как это сделать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2011, 11:10     Наследование\строки
Посмотрите здесь:

C++ Наследование
Наследование C++
наследование C++
C++ Наследование
Наследование C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.06.2011, 11:34     Наследование\строки #2
Я думаю, предполагалось следующее использование:

C++
1
2
3
4
5
6
7
8
9
Pstring2& left(Pstring2 &s2, int n) // передаём s2 тоже по ссылке
{
 // здесь происходит чудо
}
 
// а в это время где-то в main...
 
   str4 = "Hello, world! This is an awfully long string that is not meant to be fully read and understood by a programmer because of it's length and lack of sense.";
   str1.left( str2.left( str3.left( str4, 16 ), 12 ), 10 ); // вот тут самое интересное
Чтобы можно было сказать что-то большее, пожалуйста, приложите код class String, от которого наследует Pstring.
AlexP11223
36 / 37 / 4
Регистрация: 20.04.2011
Сообщений: 288
06.06.2011, 11:38  [ТС]     Наследование\строки #3
Ой, забыл его выложить.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class String                    //user-defined string type
{
protected:
    static const int SZ = 80;         //size of all String objects
    char str[SZ];             //holds a C-string
public:
    String()                  //no-arg constructor
    { str[0] = '\0'; }
    String( char s[] )        //1-arg constructor
    { strcpy(str, s); }    //   convert C-string to String
    void display() const      //display the String
    { cout << str; }
    operator char*()          //conversion operator
    { return str; }        //convert String to C-string
};
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.06.2011, 12:06     Наследование\строки #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
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
#include <iostream>
#include <string.h>
 
using namespace std;
 
class String                    //user-defined string type
{
protected:
        static const int SZ = 80;         //size of all String objects
        char str[SZ];             //holds a C-string
public:
        String()                  //no-arg constructor
        { str[0] = '\0'; }
        String( char s[] )        //1-arg constructor
        { strcpy(str, s); }    //   convert C-string to String
 
        void display() const      //display the String
        { cout << str; }
        operator char*()          //conversion operator
        { return str; }        //convert String to C-string
};
 
class Pstring : public String
{
public:
        Pstring()
        {}
        Pstring(char s[])
        {
 
                /*if (strlen(s) > SZ-1)
                {
                        int j;
                        for (j=0; j<SZ-1; j++)
                                str[j]=s[j];
                        str[j]='\0';
                }
 
                else
                        strcpy(str, s);*/
 
 
                strncpy( str, s, SZ-1 );  // так проще :)
        };
};
 
class Pstring2 : public Pstring
{
public:
    Pstring2() : Pstring()
    {}
    Pstring2(char s[]) : Pstring(s)
    {}
 
    // скопировать СЮДА первые n символов src
    Pstring2 & left( Pstring2 & src, int n )
    {
        /*if( n >= SZ )
           n = SZ - 1;*/
 
        strncpy( str, (char*)src, n );
        str[n] = 0;
 
        return *this;
    }
 
    // скопировать СЮДА n символов src, начиная с s.
    Pstring2 & mid( Pstring2 & src, int s, int n )
    {
        char * begin = &((char*)src)[s];
 
        strncpy( str, begin, n );
        str[ n ] = 0;
 
        return *this;
    }
 
    // скопировать СЮДА n последних символов src
    Pstring2 & right( Pstring2 & src, int n )
    {
        char * begin = (char*)src;
        begin = &begin[ strlen(begin) - n ];
 
        strcpy( str, begin );
 
        return *this;
    }
};
 
int main()
{
    Pstring2 str1, s1;
 
    s1 = "This is just a boring test string.";
 
    str1.left(s1, 5);
    str1.display();
 
    cout << endl;
 
    str1.mid(s1, 15, 5);
    str1.display();
 
    cout << endl;
 
    str1.right(s1, 15);
    str1.display();
 
    cout << endl;
 
    str1.right( str1.left( s1, 21 ), 13 );
    str1.display();
    cout << endl;
 
    return 0;
}
Удачи.
AlexP11223
36 / 37 / 4
Регистрация: 20.04.2011
Сообщений: 288
06.06.2011, 12:11  [ТС]     Наследование\строки #5
return *this это типа "вернуть объект, из которого вызван"? Я еще не знаю ничего про указатели
Что значит это? strncpy( str, (char*)src, n )
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.06.2011, 12:16     Наследование\строки #6
this - это для того, чтобы объект мог получить указатель на самого себя.
*this - разыменовывание указателя. То есть "идём по указателю и обращаемся к самому объекту".
return *this; - берём указатель на себя, идйм по нему, и возвращаем себя. Так как тип возв. значения - ссылка на Pstring2, то возвращается ссылка на себя.

(char*) src; - берём src и приводим его к типу char*. Так же: int a = 49; char ch = (char)a; - берём a, приводим её к типу char и записываем приведённое значение в ch. В данном случае в классе String определён
C++
1
2
operator char*()          //conversion operator
        { return str; }        //convert String to C-string
Так что в целях приведения выполняется эта функция. Фактически мы берём указатель на str из объекта src.
Yandex
Объявления
06.06.2011, 12:16     Наследование\строки
Ответ Создать тему
Опции темы

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