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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Bred
Сообщений: n/a
#1

Объектно-ориентированное программирование: Разработка класса строка - C++

17.05.2012, 13:43. Просмотров 1350. Ответов 14
Метки нет (Все метки)

НУЖНА ПОМОЩЬ
Разработка класса строка

Задание
Разработать класс String определив для него методы:
• копирования строк, реализовав оператор = ;
• поиска подстроки;
• слияния строк, реализовав операторы += и + ;
• эквивалентности строк, набор операторов == и !=;
• определения длины строки;
• вывода в поток, << ;
• ввода из потока >> ;
• вставки подcтроки с нужной позиции;
• конструктор копирования вида X::X(const X&);
Напишите программу иллюстрирующую основные методы класса String.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2012, 13:43     Объектно-ориентированное программирование: Разработка класса строка
Посмотрите здесь:
C++ Объектно ориентированное программирование
C++ Объектно-ориентированное программирование
C++ Объектно-ориентированное программирование C++
Объектно-ориентированное программирование C++
C++ Объектно ориентированное программирование.
C++ Объектно-ориентированное программирование
C++ Объектно-ориентированное программирование в С++ ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sylar9
-20 / 55 / 2
Регистрация: 04.09.2011
Сообщений: 1,921
Записей в блоге: 1
17.05.2012, 13:51     Объектно-ориентированное программирование: Разработка класса строка #2
а ты сам пробувал писать

Добавлено через 1 минуту
Я могу тебе это решить только, я это сделаю за два три дня я не профи в ООП
Bred
Сообщений: n/a
17.05.2012, 13:53     Объектно-ориентированное программирование: Разработка класса строка #3
к завтрашнему утру нужно.
увы(
(SkyNet)
22 / 40 / 6
Регистрация: 25.10.2011
Сообщений: 175
17.05.2012, 13:54     Объектно-ориентированное программирование: Разработка класса строка #4
Такой клас уже есть - #include <string>
Sylar9
-20 / 55 / 2
Регистрация: 04.09.2011
Сообщений: 1,921
Записей в блоге: 1
17.05.2012, 14:02     Объектно-ориентированное программирование: Разработка класса строка #5
Цитата Сообщение от (SkyNet) Посмотреть сообщение
Такой клас уже есть - #include <string>
я это еще давно делал что то в это роде, просто я подзабыл ООП

Добавлено через 6 минут
Цитата Сообщение от (SkyNet) Посмотреть сообщение
Такой клас уже есть - #include <string>
Ему надо завоно разработать этот класс
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
17.05.2012, 14:10     Объектно-ориентированное программирование: Разработка класса строка #6
(SkyNet), как Вы думаете, для чего задают подобные задания? Сразу же правильный ответ: чтобы иметь представление, как устроены классы и шаблоны STL. Программист обязан знать их внутреннее устройство.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
17.05.2012, 15:42     Объектно-ориентированное программирование: Разработка класса строка #7
Toshkarik, Программист обязан знать их публичный интерфейс и как с ними работать. А внутреннее устройство - абсолютно нет.
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
17.05.2012, 15:47     Объектно-ориентированное программирование: Разработка класса строка #8
http://www.cyberguru.ru/programming/...p3-page67.html
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
17.05.2012, 16:47     Объектно-ориентированное программирование: Разработка класса строка #9
С остальным сами, а то не интересно так.

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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <iostream>
#include <cstring>
#include <stdexcept>
 
class String
{
public:
   String():length_(0), is_copied_(false), string_(0)
   {
   }
   String(const char* str, const size_t len):length_(len), is_copied_(true)
   {
      string_ = new char[length_ + 1];
      strncpy(string_, str, length_);
      string_[length_] = '\0';
   }
   String(const char* str):length_(strlen(str)), is_copied_(true)
   {
      string_ = new char[length_ + 1];
      strncpy(string_, str, length_);
      string_[length_] = '\0';
   }
   ~String()
   {
      if (is_copied_)
      {
         delete[] string_;
         is_copied_ = false;
      }
   }
   String(const String& rhs)
   {
      is_copied_ = false;
      string_ = rhs.string_;
      length_ = rhs.length_;
   }
   String& operator =(const String& rhs)
   {
      is_copied_ = false;
      delete[] string_;
      String tmp(rhs);
      swap(tmp);
      return *this;
   }
   char& operator[](const size_t idx)
   {
      if (idx >= length_)
      {
         throw std::out_of_range("wrong index");
      }
      Copy();
      return string_[idx];
   }
   const char& operator[] (const size_t idx) const
   {
      if (idx >= length_)
      {
         throw std::out_of_range("wrong index");
      }
      return string_[idx];
   }
   String& operator += (const String& rhs)
   {
      Copy();
      char* tmp = new char[length_ + rhs.length_ + 1];
      strncpy(tmp, string_, length_);
      tmp[length_] = '\0';
      delete[] string_;
      strcat(tmp, rhs.string_);
      length_ += rhs.length_;
      tmp[length_] = '\0';
      string_ = tmp;
      return *this;
   }
   const char* string() const { return string_; }
   const size_t length() const { return length_; }
private:
   void swap(String& rhs)
   {
      std::swap(string_, rhs.string_);
      std::swap(length_, rhs.length_);
   }
   void Copy()
   {
      if (!is_copied_)
      {
         char* new_string = new char[length_ + 1];
         strncpy(new_string, string_, length_);
         new_string[length_] = '\0';
         string_ = new_string;
         is_copied_ = true;
      }
   }
   char* string_;
   size_t length_;
   bool is_copied_;
};
 
std::ostream& operator << (std::ostream& os, const String& rhs)
{
   os << rhs.string() << std::endl << "Address: " << (void*)rhs.string();
   return os;
}
 
String operator +(const String& lhs, const String& rhs)
{
   String result(lhs);
   result += rhs;
   return result;
}
 
bool operator == (const String& lhs, const String& rhs)
{
   return !strcpy(lhs.string(), rhs.string());
}
 
bool operator != (const String& lhs, const String& rhs)
{
   return !(lhs == rhs);
}
 
int main()
{
   String tmp("hello");
   String other("other");
   tmp = other;
   std::cout << tmp << std::endl;
   std::cout << other << std::endl;
   tmp[0] = 'a';
   std::cout << tmp << std::endl;
   std::cout << other << std::endl;
   tmp[1] = 'c';
   std::cout << tmp << std::endl;
   std::cout << other << std::endl;
   tmp += other;
   std::cout << tmp << std::endl;
   std::cout << other << std::endl;
   String new_s = tmp + other;
   std::cout << tmp << std::endl;
   std::cout << other << std::endl;
   std::cout << new_s << std::endl;
}
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
17.05.2012, 17:55     Объектно-ориентированное программирование: Разработка класса строка #10
если верить Страуструпу

string.h
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
#pragma once
#include "iostream"
 
class string
{
    struct srep 
    {
        char* s;       // указатель на строку
        int n;         // счетчик числа ссылок
        srep() 
        { 
            n = 1; 
        }
    };
    srep *p;
 
public:
    string(const char*);   //string x = "abc", конструктор с параметрами
    string(void);//конструктор по умолчанию
    ~string(void);//деструктор по умолчанию
    string(const string&); // string x = string ...
    string &operator= (const char*);
    string &operator= (const string&);
    char &operator[](int i);
 
    friend std::ostream& operator<< (std::ostream&, const string&);
    friend std::istream& operator>> (std::istream&, string&);
 
    friend int operator== (const string &x, const char *s)
    {
        return strcmp(x.p->s, s) == 0; 
    }
 
    friend int operator== (const string &x, const string &y)
    { 
        return strcmp(x.p->s,y.p->s) == 0; 
    }
    
    friend int operator!= (const string &x, const char *s)
    { 
        return strcmp(x.p->s,s) != 0; 
    }
 
    friend int operator!= (const string &x, const string &y)
    { 
        return strcmp(x.p->s,y.p->s) != 0; 
    }
};
 
void error(const char* p);
string.cpp

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
#include "string.h"
#include <iostream>
 
string::string() 
{
    p = new srep;
    p->s = 0;
}
 
string::string(const string& x)
{
    x.p->n++;
    p = x.p;
}
 
string::string(const char* s)
{
    p = new srep;
    p->s = new char[strlen(s) + 1];
    strcpy(p->s, s);
}
 
string::~string()
{
    if (--p->n == 0) 
    {
        delete [] p->s;
        delete p;
    }
} 
 
std::ostream& operator<<(std::ostream& s, const string& x)
{
    return s << x.p->s;// << " [" << x.p->n << "]\n";
}
 
std::istream& operator>>(std::istream& s, string& x)
{
             char buf[256];
             s >> buf;   // ненадежно: возможно переполнение buf
                         // правильное решение см. в $$10.3.1
             x = buf;
             //cout << "echo: " << x << '\n';
             return s;
}
 
string& string::operator=(const char* s)
{
    if (p->n > 1) 
    {  // отсоединяемся от старой строки
        p->n--;
        p = new srep;
    }
    else    // освобождаем строку со старым значением
    {
        delete [] p->s;
    }
 
    p->s = new char[ strlen(s)+1 ];
    strcpy(p->s, s);
    return *this;
}
 
string& string::operator=(const string& x)
{
    x.p->n++;  // защита от случая ``st = st''
    if (--p->n == 0) 
    {
        delete[] p->s;
        delete p;
    }
    p = x.p;
    return *this;
}
 
void error(const char* p)
{
    std::cerr << p << '\n';
    exit(1);
}
 
char& string::operator[](int i)
{
    if (i < 0 || strlen(p->s) < i)
    {
        error("недопустимое значение индекса");
    }
        return p->s[i];
}
main.cpp
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
#include "iostream"
#include "string.h"
 
 
int main()
{   
    setlocale(0,"");
    string x[100];
    int n;
 
    std::cout << " здесь начало \n";
 
    for ( n = 0; std::cin >> x[n]; n++) 
    {
        if (n == 100)
        {
            error("слишком много слов");
            return 99;
        }
        string y;
        std::cout << (y = x[n]);
        if (y == "done") break;
    }
    std::cout << "теперь мы идем по словам в обратном порядке \n";
    for (int i = n - 1; 0 <= i; i--)
    {
        std::cout << x[i];
    }
    return 0;
 
    system("pause >> null");
    return 0;
}
Vlad-letchik
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 38
17.05.2012, 20:06     Объектно-ориентированное программирование: Разработка класса строка #11
группа 102?
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
17.05.2012, 21:12     Объектно-ориентированное программирование: Разработка класса строка #12
Цитата Сообщение от ForEveR Посмотреть сообщение
C++
1
2
3
4
bool operator == (const String& lhs, const String& rhs)
{
   return !strcpy(lhs.string(), rhs.string());
}
А тут точно нет никакой ошибки?
Ну да ладно. Автор, поищи, в интеренете примеров полно. Я даже знаю, где можно найти, то что вам надо. Надо найти исходники, прилагаемые к книге Дейтелов "Как программировать на C++", почти на 100% уверен, что там есть то что вам нужно
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
17.05.2012, 21:27     Объектно-ориентированное программирование: Разработка класса строка #13
ForEveR, ну мое мнение, что он обязан знать, как примерно устроена любая библиотека, с которой он работает. Тем более стандартная.
MrGluck
Модератор
Эксперт CЭксперт С++
7172 / 4338 / 633
Регистрация: 29.11.2010
Сообщений: 11,785
17.05.2012, 22:28     Объектно-ориентированное программирование: Разработка класса строка #14
Я тоже считаю, что прежде, чем использовать функции, надо понять их механизм. А толку со знания интерфейса, если не понимаешь до конца, как оно работает. Конечно, не стоит каждый раз изобретать велосипед, достаточно лишь один раз проработать, а потом уже использовать. Ну, в крайнем случае, посмотреть устройство в самой библиотеке.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2012, 22:32     Объектно-ориентированное программирование: Разработка класса строка
Еще ссылки по теме:
Объектно-ориентированное программирование C++
Функции Объектно-ориентированное программирование C++
C++ Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
C++ Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Ищу ответы на задания из книги Лафоре Р. "Объектно-ориентированное программирование в С++" 4 издание. C++

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
17.05.2012, 22:32     Объектно-ориентированное программирование: Разработка класса строка #15
Цитата Сообщение от Buckstabue Посмотреть сообщение
return !strcpy(lhs.string(), rhs.string());
strcmp конечно же
Цитата Сообщение от MrGluck Посмотреть сообщение
А толку со знания интерфейса, если не понимаешь до конца, как оно работает.
контейнеры еще ладно, а понимание устройства например stl'вских алгоритмов не столь тривиально (метапрограммирование на с++ и прочие замечательные вещи)
Yandex
Объявления
17.05.2012, 22:32     Объектно-ориентированное программирование: Разработка класса строка
Ответ Создать тему
Опции темы

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