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

Разработать класс String - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Graphics.h вывод рисунка на экран из файла http://www.cyberforum.ru/cpp-beginners/thread582868.html
Единственный вопрос как вывести на экран изображение из рисунка? (например формата bmp) initwindow(1280, 720, "Game"); А дальше что?
C++ сортировка матрицы создать матрицу размером м*н значения случайно от -15 до 10 отсортировать строки по сумме элементов в строке код С http://www.cyberforum.ru/cpp-beginners/thread582866.html
Символы C++
дана строка символов, надо сделать так чтобы остались только буквы помогите
C++ Сортировка вставками
Программа работает, но криво( Нужно, что бы 10 массивов рандомных было, а не один. И еще плохо считает в рандомном массиве сравнения. И еще нужно среднее сравнение за 10 массивов что бы считал. Прошу помощи, не могу разобратся( #include <stdlib.h> #include <stdio.h>
C++ Почему файл со списком не подключается к проекту? http://www.cyberforum.ru/cpp-beginners/thread582845.html
Файл существует список тоже создан из среды разработки Visual 2010 почти все ошибки исправлены только эта и осталась. #pragma once #include <iostream> #include <stdio.h> #include <string> #include <TextFile1.txt> #include "TextFile1.txt"
C++ Разработать класс String определив для него методы Нужно разработать класс String определив для него методы: • копирования строк, реализовав оператор = ; • поиска подстроки; • слияния строк, реализовав операторы += и + ; • эквивалентности строк, набор операторов == и !=; • определения длины строки; • вывода в поток, << ; • ввода из потока >> ; • вставки подcтроки с нужной позиции; • конструктор копирования вида X::X(const X&); подробнее

Показать сообщение отдельно
Vlad-letchik
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 38
22.05.2012, 19:15     Разработать класс String
Разработка класса строка

Задание
Разработать класс String определив для него методы:
• копирования строк, реализовав оператор = ;
• поиска подстроки;
• слияния строк, реализовав операторы += и + ;
• эквивалентности строк, набор операторов == и !=;
• определения длины строки;
• вывода в поток, << ;
• ввода из потока >> ;
• вставки подcтроки с нужной позиции;
• конструктор копирования вида X::X(const X&);
Напишите программу иллюстрирующую основные методы класса String.

Я где-то нашел вот такой код здесь, но выдает ошибки:
http://www.cyberguru.ru/programming/...p3-page67.html
Пожалуйста помогите все исправить, т. к. я в программировании ничего не понимаю, а надо закрыть предмет(он как дополнительный)
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
#include <iostream>
#include <string.h>
 
            class string {
               struct srep {
                 char* s;       // указатель на строку
                 int n;         // счетчик числа ссылок
                 srep() { n = 1; }
               };
               srep *p;
 
            public:
              string(const char *);   // string x = "abc"
              string();               // string x;
              string(const string &); // string x = string ...
              string& operator=(const char *);
              string& operator=(const string &);
              ~string();
              char& operator[](int i);
 
              friend ostream& operator<<(ostream&, const string&);
              friend istream& operator>>(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; }
           };
             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;
             }
           }
             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;
          }  ostream& operator<<(ostream& s, const string& x)
          {
             return s << x.p->s << " [" << x.p->n << "]\n";
          } istream& operator>>(istream& s, string& x)
          {
             char buf[256];
             s >> buf;   // ненадежно: возможно переполнение buf
                         // правильное решение см. в $$10.3.1
             x = buf;
             cout << "echo: " << x << '\n';
             return s;
           }  void error(const char* p)
          {
            cerr << p << '\n';
            exit(1);
          }
 
         char& string::operator[](int i)
        {
         if (i<0 || strlen(p->s)<i) error("недопустимое значение индекса");
           return p->s[i];
        }   int main()
         {
           string x[100];
           int n;
 
           cout << " здесь начало \n";
 
           for ( n = 0; cin>>x[n]; n++) {
               if (n==100) {
                  error("слишком много слов");
                  return 99;
               }
               string y;
               cout << (y = x[n]);
               if (y == "done") break;
 
           }
           cout << "теперь мы идем по словам в обратном порядке \n";
           for (int i=n-1; 0<=i; i--) cout << x[i];
           return 0;
         }
Добавлено через 2 минуты
Или вот еще код, но здесь похоже не все задание:
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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 23:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru