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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
#1

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

02.08.2009, 17:28. Просмотров 1554. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2009, 17:28     Наследование, возврат по ссылке..
Посмотрите здесь:

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

Возврат по ссылке - C++
Приветствую всех! Есть пример из книги Р. Лафоре &quot;Объекто-ориентированное программирование в C++&quot;: #include &lt;iostream&gt; using...

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

Как происходит возврат значения по ссылке? - C++
Добрый вечер, распишите пожалуйста детально про то, как происходит возврат значения по ссылке. Можно вот на этом примере: alpha&amp;...

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

возврат - C++
пример: функция была выполнена с ошибкой, как сделать возврат на предыдущее функцию?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт С++
8283 / 3502 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
02.08.2009, 17:47     Наследование, возврат по ссылке.. #2
insolent, я конечно очень давно не писал на ООП С++, но надо все-таки left вызывать с параметрами
insolent
826 / 347 / 15
Регистрация: 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-символов.
M128K145
Эксперт С++
8283 / 3502 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
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;
}
Миниатюры
Наследование, возврат по ссылке..  
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
02.08.2009, 18:53  [ТС]     Наследование, возврат по ссылке.. #5
M128K145, я такой вариант тоже рассматривал, но мне нужно, чтобы left была слева от "равно".
ISergey
Maniac
Эксперт С++
1372 / 883 / 52
Регистрация: 02.01.2009
Сообщений: 2,652
Записей в блоге: 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();
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
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
insolent
826 / 347 / 15
Регистрация: 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: необъявленный идентификатор
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
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;
}
но делать за тебя человеческие конструкторы и деструкторы все равно никто не будет.
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
03.08.2009, 00:19  [ТС]     Наследование, возврат по ссылке.. #10
Цитата Сообщение от Patch Посмотреть сообщение
еще раз
Легче не стало(

Цитата Сообщение от Patch Посмотреть сообщение
но делать за тебя человеческие конструкторы и деструкторы все равно никто не будет.
Есл ибы я умел, то я вряд ли бы постил..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2009, 08:55     Наследование, возврат по ссылке..
Еще ссылки по теме:

Возврат в функцию - C++
Как сделать так, чтобы когда функция выполнилась, она вернула управление не в точку, из которой вызывалась, а в начало вызывающей функции?

Возврат массива - C++
Не спрашивайте зачем я это делаю, если можно просто использовать strcpy. char tostrcpy(char *to, char *from); int main(int i) { ...

Возврат коретки - C++
В чём отличие. Программы выводят разные данные? Думаю, что 1 код работает почему-то неправильно, т.к. выход должен быть twe. #include...

возврат вектора из ф-ии - C++
void func(std::vector&lt;const char*&gt;&amp; ret) { ret.push_back(&quot;абв&quot;); } int main() { std::vector&lt;const char*&gt; ret; ...


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

Или воспользуйтесь поиском по форуму:
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
03.08.2009, 08:55     Наследование, возврат по ссылке.. #11
Цитата Сообщение от insolent Посмотреть сообщение
Есл ибы я умел, то я вряд ли бы постил..
книжечку почитайте по С++. вы спрашиваете основы.
Yandex
Объявления
03.08.2009, 08:55     Наследование, возврат по ссылке..
Ответ Создать тему
Опции темы

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