Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
insolent
827 / 345 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
1

Наследование, возврат по ссылке..

02.08.2009, 17:28. Просмотров 1639. Ответов 10
Метки нет (Все метки)

Есть такое
задание
В некоторых компьютерных языках, таких как Visual Basic, есть операции,
с помощью которых можно выделить часть строки и присвоить ее другой строке.
(В стандартном классе string предложены различные подходы.) Используя
наследование, добавьте такую возможность в класс Pstring из упражнения 2. В новом
производном классе Pstring2 разместите три новых функции: left(), mid(), right().

s2.left ( s1, n )
в строку s2 помещается n самых левых символов строки s1

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
71
72
73
74
75
76
77
78
79
80
81
#include <iostream> 
#include <string>
#include <Windows.h>
using namespace std;
//////////////////////////////////////////////////////////////////////////
class String //базовый класс 
{ 
protected:  
    enum {SZ = 255 }; //размер всех объектов String 
    char str [SZ]; //содержит С-строку 
public: 
    String() //конструктор без аргументов 
    {
        str [0] ='\0';
    } 
    String(char* s) //конструктор c одинм аргументом
    {
        strcpy(str,s);
    } 
    void display()const //вывести String 
    {
        cout << str;
    } 
    operator char*() //функция преобразования 
    {
        return str;
    } //преобразовать String в C-string 
};
//////////////////////////////////////////////////////////////////////////
class Pstring :public String //порожденный класс 
{ 
public: 
    Pstring():String()
    {}
    Pstring(char* s);
};
//------------------------------------------------------------------------
Pstring::Pstring(char* s) //конструктор для Pstring 
{ 
    int n;
    n = ((strlen(s) > SZ-1) ? SZ-1 : strlen(s));
    strncpy(str,s,n);
    str[n] = '\0';
}
//////////////////////////////////////////////////////////////////////////
class Pstring2 : public Pstring
{
public:
    Pstring2():Pstring()
    {}
    Pstring2(char* s):Pstring(s)
    {}
    Pstring2& left(Pstring2 s1,int n);
    Pstring2& mid(Pstring2 s1,int s,int n);
    Pstring2& right(Pstring2 s1,int n);
    void display()
    {
        Pstring::display();
    }
    operator char*()
    {
        return str;
    }
};
//////////////////////////////////////////////////////////////////////////
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    Pstring2 s1 = "Это очень-очень длинная строка, которая, возможно,да, нет. точно, - превысит размер, ограниченный SZ";
    s1.left() = "Добавка. "; 
    cout <<"\nsl=";
    cout << static_cast<char*>(s1) << endl;
    Pstring2 s2 = "А это коротенькая строка";
    s2.left() = "Добавка. ";
    cout <<"\ns2=";
    s2.display();
    cout << endl;
    getchar();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2009, 17:28
Ответы с готовыми решениями:

Возврат по ссылке
Приветствую всех! Есть пример из книги Р. Лафоре &quot;Объекто-ориентированное...

Возврат по ссылке
Вычитал давно еще, что если возвращать статический обьект из метода и присвоить...

Возврат значения по ссылке
Долго гуглил, но что-то так и не понял. Почему слева от знака = может...

Как происходит возврат значения по ссылке?
Добрый вечер, распишите пожалуйста детально про то, как происходит возврат...

Возврат результата из функции через параметр по ссылке
Здравствуйте уважаемый форумчане! Подскажите, как вернуть результат работы...

10
M128K145
Эксперт JavaЭксперт С++
8326 / 3546 / 420
Регистрация: 03.07.2009
Сообщений: 10,708
02.08.2009, 17:47 2
insolent, я конечно очень давно не писал на ООП С++, но надо все-таки left вызывать с параметрами
0
insolent
827 / 345 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
02.08.2009, 18:04  [ТС] 3
Цитата Сообщение от M128K145 Посмотреть сообщение
left вызывать с параметрами
Сорри. Не дописал.
Вот моя ф-ция left:
C++
1
2
3
4
5
6
Pstring2& Pstring2::left(Pstring2 s1, int n)
{
    for(int i = 0;i < n;i++)
        str[i] = s1.str[i];
    return *this;
}
,но она не заменяет слева n-символов, а убирает предыдущую строку и оставляет эти n-символов.
0
M128K145
Эксперт JavaЭксперт С++
8326 / 3546 / 420
Регистрация: 03.07.2009
Сообщений: 10,708
02.08.2009, 18:43 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
#include "stdafx.h"
#include <iostream> 
using namespace std;
 
class String //базовый класс 
{ 
protected:  
    enum {SZ = 255 }; //размер всех объектов String 
    char str [SZ]; //содержит С-строку 
public: 
    String() //конструктор без аргументов 
    {
        str [0] ='\0';
    } 
    String(char* s) //конструктор c одинм аргументом
    {
        strcpy(str,s);
    } 
    void display()const //вывести String 
    {
        cout << str;
    } 
    operator char*() //функция преобразования 
    {
        return str;
    } //преобразовать String в C-string 
};
 
class Pstring :public String //порожденный класс 
{ 
public: 
    Pstring():String()
    {}
    Pstring(char* s);
};
 
Pstring::Pstring(char* s) //конструктор для Pstring 
{ 
    int n;
    n = ((strlen(s) > SZ-1) ? SZ-1 : strlen(s));
    strncpy(str,s,n);
    str[n] = '\0';
}
 
class Pstring2 : public Pstring
{
public:
    Pstring2():Pstring()
    {}
    Pstring2(char* s):Pstring(s)
    {}
    Pstring2& left(Pstring2 s1,int n);
    Pstring2& mid(Pstring2 s1,int s,int n);
    Pstring2& right(Pstring2 s1,int n);
    void display()
    {
        Pstring::display();
    }
    operator char*()
    {
        return str;
    }
};
Pstring2& Pstring2::left(Pstring2 s1, int n)
{
    for(int i = 0;i < n;i++)
        str[i] = s1.str[i];
    return *this;
}
int main()
{
    setlocale (LC_ALL, "Russian");
    Pstring2 s1 = "Это очень-очень длинная строка, которая, возможно,да, нет. точно, - превысит размер, ограниченный SZ";
    Pstring2 s3 = "Метод left";
    s1.display();
    cout<<"\n\n";
    Pstring2 s2 = s1.left(s3, 10);
    s2.display();
    cout<<"\n\n";
    system("pause");
    return 0;
}
0
Миниатюры
Наследование, возврат по ссылке..  
insolent
827 / 345 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
02.08.2009, 18:53  [ТС] 5
M128K145, я такой вариант тоже рассматривал, но мне нужно, чтобы left была слева от "равно".
0
ISergey
Maniac
Эксперт С++
1409 / 920 / 148
Регистрация: 02.01.2009
Сообщений: 2,749
Записей в блоге: 1
02.08.2009, 18:58 6
Цитата Сообщение от M128K145 Посмотреть сообщение
По моему все работает.
только не правильно..
C++
1
2
3
4
5
6
 s1.display();
 cout<<"\n\n";
 Pstring2 s2 = s1.left(s3, 10);
 s2.display();
 cout<<"\n\n";
 s1.display();
0
Patch
2336 / 492 / 22
Регистрация: 01.04.2009
Сообщений: 2,181
02.08.2009, 19:10 7
примерно так:
C++
1
2
3
4
5
6
7
8
9
Pstring2& Pstring2::left(Pstring2 s1, int n)
{
        nstr = new Pstring2(int n); //конструктор не корректен. должен делаться пустой массив
        for(int i = 0;i < n;i++)
                nstr->str[i] = s1.str[i];
        if(this == s1)
             delete ???; //... вообще, здесь должен быть вызов деструктора. но в классе я его не нашел =-O
        return nstr;
}
что-то подобное сделано в MFC, класс CString
0
insolent
827 / 345 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
02.08.2009, 19:51  [ТС] 8
Patch, что-то
ругается
Код
1>c:\myprojects\pstring\pstring\pstring.cpp(71) : error C2065: nstr: необъявленный идентификатор
1>c:\myprojects\pstring\pstring\pstring.cpp(71) : error C2062: тип "int" не требуется
1>c:\myprojects\pstring\pstring\pstring.cpp(73) : error C2065: nstr: необъявленный идентификатор
1>c:\myprojects\pstring\pstring\pstring.cpp(73) : error C2227: выражение слева от "->str" должно указывать на тип класса, структуры или объединения либо на универсальный тип
1>        тип: 'unknown-type'
1>c:\myprojects\pstring\pstring\pstring.cpp(74) : error C2678: бинарный '==': не найден оператор, принимающий левый операнд типа 'Pstring2 *const ' (или приемлемое преобразование отсутствует)
1>        может быть 'встроенный оператор C++==(char *, char *)'
1>        или       'встроенный оператор C++==(Pstring2 *, Pstring2 *)'
1>        c:\program files\microsoft sdks\windows\v6.0a\include\guiddef.h(192): или       'int operator ==(const GUID &,const GUID &)'
1>        при попытке сопоставить список аргументов '(Pstring2 *const , Pstring2)'
1>c:\myprojects\pstring\pstring\pstring.cpp(75) : error C2059: синтаксическая ошибка: ?
1>c:\myprojects\pstring\pstring\pstring.cpp(76) : error C2065: nstr: необъявленный идентификатор
0
Patch
2336 / 492 / 22
Регистрация: 01.04.2009
Сообщений: 2,181
02.08.2009, 23:58 9
Цитата Сообщение от insolent Посмотреть сообщение
Patch, что-то ругается
блин, как маленький...
само собой я опустил объявление.
ладно, еще раз:
C++
1
2
3
4
5
6
7
8
9
Pstring2& Pstring2::left(Pstring2 s1, int n)
{
        Pstring2 nstr = (Pstring2 *)new Pstring2(int n); //конструктор не корректен. должен делаться пустой массив
        for(int i = 0;i < n;i++)
                nstr->str[i] = s1.str[i];
        if(this == &s1)
             delete ???; //... вообще, здесь должен быть вызов деструктора. но в классе я его не нашел =-O
        return nstr;
}
но делать за тебя человеческие конструкторы и деструкторы все равно никто не будет.
0
insolent
827 / 345 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
03.08.2009, 00:19  [ТС] 10
Цитата Сообщение от Patch Посмотреть сообщение
еще раз
Легче не стало(

Цитата Сообщение от Patch Посмотреть сообщение
но делать за тебя человеческие конструкторы и деструкторы все равно никто не будет.
Есл ибы я умел, то я вряд ли бы постил..
0
zim22
depict1
276 / 141 / 4
Регистрация: 11.07.2009
Сообщений: 606
03.08.2009, 08:55 11
Цитата Сообщение от insolent Посмотреть сообщение
Есл ибы я умел, то я вряд ли бы постил..
книжечку почитайте по С++. вы спрашиваете основы.
0
03.08.2009, 08:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2009, 08:55

Заменить наследование классов на наследование интерфейсов
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int...

Возврат значения функции по ссылке возможен?
Добрый день! Хочу уточнить некоторый принцип работы с функциями, возвращающими...

jQuery, запрет перехода по ссылке, Как запретить переход по ссылке, кликая по img внутри нее же?
есть такая конструкция &lt;a href=&quot;link.php&quot;&gt;&lt;img src='pic.jpg'&gt;&lt;/a&gt; когда...


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

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

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