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

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

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

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

06.06.2011, 11:10. Просмотров 407. Ответов 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++
Задача: Мое решение: //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++
Добрый вечер, помогите пожалуйста с наследованием. Написал программу ( ниже ), но как видите пришлось в классе-наследнике Bus ( Vehicle...

Наследование - C++
Здравствуйте. Есть класс Shape3D, у которой два виртуальных метода (площадь и объем). Есть наследник параллилепипед, у которого есть...

Наследование - C++
Создаю базовый класс: #include &lt;string&gt; using namespace std ; class T { protected: string name ;

Наследование - C++
Помогите найти ошибку,не выводит на экран данные,Задание: Разработать программу с использованием наследования классов, реализую-щую...

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

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

НАСЛЕДОВАНИЕ - C++
Привет! Есть у меня одна задачка из лабораторной работы. Дело в том что на лекцие я не был по этой теме(Наследование), и потому прошу...

Наследование - C++
Добрый вечер! Ребята, почему в данном примере #include &lt;iostream&gt; using namespace std; ...

Наследование в с++ - C++
Люди добрые, помогите пожалуйста. Нужно срочно сдать программу по теме &quot;Наследование&quot;, но че-то не могу написать. Наследование только...

Наследование - C++
Добрый день. Мне нужно реализовать такую структуру классов: есть класс 1, от него наследуются три класса: 2.1, 2.2, 2.3. От этих трех...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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.
Yandex
Объявления
06.06.2011, 12:16     Наследование\строки
Ответ Создать тему
Опции темы

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