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

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

Войти
Регистрация
Восстановить пароль
 
AlexP11223
36 / 37 / 4
Регистрация: 20.04.2011
Сообщений: 288
#1

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

06.06.2011, 11:10. Просмотров 408. Ответов 5
Метки нет (Все метки)

задание
В некоторых компьютерных языках, таких, как 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++
Задача: Мое решение: //9-2.cpp #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std;

Закрытое наследование. Вывод строки - C++
Здравствуйте. Необходимо вывести элемент класса std::string в данном случае: class Wine : protected Pair, private string { int...

Заменить наследование классов на наследование интерфейсов - C++
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int people_on_base = 100; int vehicles_on_base = 100; double...

Наследование в С++ - C++
Здравствуйте, написал вот код для программы с наследованием, работает, но когда вычисляет площадь, пишет: S=0,когда площадь не равна нулю....

Наследование С++ - C++
Есть базовый клас Data. Клас person наследует Data . Клас waiter наследует класы person и Data . Нужно перегрузить операцию вывода для...

Наследование - C++
Доброе дня, прошу вас помочь в решение данной задачи.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
talis
791 / 543 / 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
791 / 543 / 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
791 / 543 / 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.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2011, 12:16
Привет! Вот еще темы с ответами:

наследование - C++
Помогите разобраться в программе. Почему возникают такие ошибки cylindr.cpp expected `,' or `...' before '&amp;' token cylindr.cpp `c'...

Наследование - C++
&quot;Создать массив объектов базового класса и заполнить этот массив объектами&quot; - вот это непонятно... Как создать массив объектов базового...

Наследование - C++
Мне нужно сделать подклас, для этого нужно предыдущий класс присоединить. Объявил #include &quot;Fraction.h&quot;, что еще надо ? #include...

Наследование - C++
Подскажите пожалуйста, имеется вот такая схемка связей, прошу прощения за свое рисование: click (стрелки это наследование, где стрелка,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.06.2011, 12:16
Ответ Создать тему
Опции темы

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