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

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

02.08.2009, 17:28. Просмотров 1825. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.08.2009, 17:28
Ответы с готовыми решениями:

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

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

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

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

10
Эксперт JavaЭксперт С++
8358 / 3579 / 419
Регистрация: 03.07.2009
Сообщений: 10,708
02.08.2009, 17:47 2
insolent, я конечно очень давно не писал на ООП С++, но надо все-таки left вызывать с параметрами
0
827 / 349 / 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
Эксперт JavaЭксперт С++
8358 / 3579 / 419
Регистрация: 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
Миниатюры
Наследование, возврат по ссылке..  
827 / 349 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
02.08.2009, 18:53  [ТС] 5
M128K145, я такой вариант тоже рассматривал, но мне нужно, чтобы left была слева от "равно".
0
Maniac
Эксперт С++
1445 / 947 / 158
Регистрация: 02.01.2009
Сообщений: 2,813
Записей в блоге: 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
2341 / 497 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
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
827 / 349 / 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
2341 / 497 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
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
827 / 349 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
03.08.2009, 00:19  [ТС] 10
Цитата Сообщение от Patch Посмотреть сообщение
еще раз
Легче не стало(

Цитата Сообщение от Patch Посмотреть сообщение
но делать за тебя человеческие конструкторы и деструкторы все равно никто не будет.
Есл ибы я умел, то я вряд ли бы постил..
0
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
03.08.2009, 08:55 11
Цитата Сообщение от insolent Посмотреть сообщение
Есл ибы я умел, то я вряд ли бы постил..
книжечку почитайте по С++. вы спрашиваете основы.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.08.2009, 08:55

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Запутался и уже не понимаю как вообще может работать возврат объекта по ссылке
Здравствуйте, киберфорумчане. Сейчас читаю Г. Шилдта и в его книге рассказывается о побочных...

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

Принятие параметров в ссылке и их отправка далее по ссылке без action
Доброго времени суток. У меня есть данный кусок кода &lt;?php if (isset($_GET)) { $_SESSION...


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

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

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