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

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

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

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

02.08.2009, 17:28. Просмотров 1562. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование, возврат по ссылке.. (C++):

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

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

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

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

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

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

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

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

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

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

Наследование шаблоном шаблона (наследование конструктора) - C++ Builder
Всем привет! Думаю, что эта тема хоть и касается общих вопросов программирования, но будет уместна в данном разделе т.к. у различных...

Наследование интерфейса и наследование реализации - C#
Начал читать книгу GoF и сразу же в предисловии попал в тупик. Чем отличается наследование интерфейса от наследования реализации? Что такое...


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

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

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