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

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

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

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

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

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

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

Объектно-ориентированное программирование - C++
На основе объектного подхода создать программу которая рассчитывает значения степенных функций y=sqr(x), корень 3, 4, 5 степеней. В...

Объектно-ориентированное программирование C++ - C++
подскажите пожалуйста литературу,видео конал на You tube, или ещо что то для изучения объектно-ориентированное программирование на С++,...

Объектно ориентированное программирование. - C++
Нужно решить задачи. Помогите кому это не сложно, очень нужно. Вот задачи: 1) Создание и редактирование классов. Нужно создать класс...

Объектно-ориентированное программирование - C++
Помогите мне отредактировать программу...У меня есть исходники..Склеить нужно.... Класс Данные класса Методы ...

Объектно-ориентированное программирование - C++
Составить описание класса одномерных массивов строк, каждая строка которых задается длиной и указателем на выделенную для нее память....

Объектно ориентированное программирование - C++
Нужно решить задачи. Помогите кому это не сложно, очень нужно. Вот задачи: 1) Создание и редактирование классов. Нужно создать класс...

14
Sylar9
-20 / 55 / 2
Регистрация: 04.09.2011
Сообщений: 1,942
Записей в блоге: 1
17.05.2012, 13:51 #2
а ты сам пробувал писать

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

Добавлено через 6 минут
Цитата Сообщение от (SkyNet) Посмотреть сообщение
Такой клас уже есть - #include <string>
Ему надо завоно разработать этот класс
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
17.05.2012, 14:10 #6
(SkyNet), как Вы думаете, для чего задают подобные задания? Сразу же правильный ответ: чтобы иметь представление, как устроены классы и шаблоны STL. Программист обязан знать их внутреннее устройство.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
17.05.2012, 15:42 #7
Toshkarik, Программист обязан знать их публичный интерфейс и как с ними работать. А внутреннее устройство - абсолютно нет.
0
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
17.05.2012, 15:47 #8
http://www.cyberguru.ru/programming/...p3-page67.html
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 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;
}
0
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;
}
0
Vlad-letchik
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 38
17.05.2012, 20:06 #11
группа 102?
0
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% уверен, что там есть то что вам нужно
1
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
17.05.2012, 21:27 #13
ForEveR, ну мое мнение, что он обязан знать, как примерно устроена любая библиотека, с которой он работает. Тем более стандартная.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
17.05.2012, 22:28 #14
Я тоже считаю, что прежде, чем использовать функции, надо понять их механизм. А толку со знания интерфейса, если не понимаешь до конца, как оно работает. Конечно, не стоит каждый раз изобретать велосипед, достаточно лишь один раз проработать, а потом уже использовать. Ну, в крайнем случае, посмотреть устройство в самой библиотеке.
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
17.05.2012, 22:32 #15
Цитата Сообщение от Buckstabue Посмотреть сообщение
return !strcpy(lhs.string(), rhs.string());
strcmp конечно же
Цитата Сообщение от MrGluck Посмотреть сообщение
А толку со знания интерфейса, если не понимаешь до конца, как оно работает.
контейнеры еще ладно, а понимание устройства например stl'вских алгоритмов не столь тривиально (метапрограммирование на с++ и прочие замечательные вещи)
1
17.05.2012, 22:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2012, 22:32
Привет! Вот еще темы с ответами:

Объектно-ориентированное программирование в С++ ? - C++
Книга Р. Лафоре - Объектно-ориентированное программирование в С++ как вам ?

Объектно-ориентированное программирование - C++
Кто силён и мне поможет? Объектно-ориентированное программирование 1. Объявить класс по приведенному ниже заданию в соответствии с...

Функции Объектно-ориентированное программирование - C++
Переделать задачу так, чтобы в ней присутствовали функции объектно-ориентированное программирование. То есть использовать классы,...

Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" - C++
Хотя я и начинающий с++-шник. Хочу помочь другим людям. Здесь я буду выкладывать всё что мне удалось решить. В моих решениях будет много...


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

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

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