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

Свой класс String - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ do this 10 second's http://www.cyberforum.ru/cpp-beginners/thread358119.html
вобщем сабж. Имеется некоторая функция foo. Хочется, чтобы она выполнялась 10 секунд: int timer = 10 //секунд; while(timer){ foo() } Как попроще реализовать? Добавлено через 1 минуту редактирование не работает. Имелось ввиду: int timer = 10 //секунд; while(timer){ foo() }
C++ char посоветуйте книжку где по подробнее описывается взаимодействие в char на c http://www.cyberforum.ru/cpp-beginners/thread358102.html
Объявление массивов в С/С++ C++
Пытаюсь создать матрицу размера n: #include <iostream> using namespace std; int main() { int n,i,j; int m; cout << "Введите n\n"; cin >> n;
error C2601: 'main' : local function definitions are illegal fatal error C1004: unexpected end of file found C++
День добрый люди написал програму выдает 2 ошибки че не так подскажите error C2601: 'main' : local function definitions are illegal fatal error C1004: unexpected end of file found #include "stdafx.h" #include <iostream> #include <string.h> #include <conio.h> using namespace std;
C++ Алгометрические мовы та программирование http://www.cyberforum.ru/cpp-beginners/thread358080.html
помогите написать я сам не программис и не когда не учился , может у кого то что то есть ) плиз помогите Желательно бесплатно :cry:
C++ Помощь в создании массива на c++ Прошу помощи в задании, заранее спасибо. Даны вещественные массивы n от 20,определить для каждого массива является ли он возрастающей последовательностью и вычислить средне геометрического всех положительных элементов массива. Если не сложно, прошу пояснить момент со средне геометрическим. подробнее

Показать сообщение отдельно
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
29.09.2011, 17:37     Свой класс String
Небольшой набросок на класс String
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
#include <iostream>
#include <cstring>
using namespace std;
 
class String
{
    struct Srep;//представление
    Srep *rep;
    class Cref;//ссылка на char
 
    public:
    class Range{};//исключения
    String();//x=""
    String (const char*);//x="abc"
    String (const String&);//x=other_string
    String& operator=(const char*);
    String& operator=(const String&);
 
    void check(int i) const
    {
        if(i<0 || (rep->sz)<=i) throw Rangee(); //ОШИБКА ОШИБКА ОШИБКА
    }
 
    char read(int i) const {return rep->s[i];}
    void write(int i,char c){rep=rep->get_own_copy();rep->s[i]=c;}
    Cref operator[](int i){check(i);return Cref(*this,i);}
    char operator[](int i) const{check(i);return rep->s[i];}
    int size() const{return rep->sz;}
    ~String();
};
 
class String::Srep
{
public:
    char *s;//указатель на элемент
    int sz;//кол-во символов
    int n;//счётчик символов
 
    Srep(int nsz, const char *p)
    {
        n=1;
        sz=nsz;
        s=new char[sz+1];
        strcpy(s,p);
    }
 
    ~Srep(){delete []s;}
 
    Srep* get_own_copy()
    {
        if(n==1) return this;
        n--;
        return new Srep(sz,s);
    }
 
    void assign(int nsz, const char* p)
    {
        if (sz!=nsz)
        {
            delete[] s;
            sz=nsz;
            s=new char[sz+1];
        }
        strcpy(s,p);
    }
    private:
    Srep (const Srep&);
    Srep& operator=(const Srep&);
};
 
String::String()
{
    rep=new Srep(0,"");
};
 
String::String(const String& x)
{
    x.rep->n++;
    rep=x.rep; //разделяемое представление
};
 
String::~String()
{
    if(--rep->n==0) delete rep;
};
 
String &String::operator=(const String &x)
{
    x.rep->n++;//защита от "st=st"
    if(--rep->n==0) delete rep;
    rep=x.rep;
    return *this;
};
 
String::String(const char* s)
{
    rep=new Srep(strlen(s),s);
};
 
String& String::operator=(const char *s)
{
    if(rep->n==1)
     rep->assign(strlen(s),s); //используем старый Srep
    else
    {
        rep->n--;
        rep=new Srep(strlen(s),s);//используем новый Srep
    }
    return *this;
};
 
class String::Cref
{
    friend class String;
    String &s;
    int i;
    Cref(String & ss, int ii):s(ss),i(ii){}
    Cref(const Cref& r):s(r.s),i(r.i){}
    Cref();
 
public:
    operator char() const{s.check(i);return s.read(i);}//выдаёт значение
    void operator=(char c) {s.write(i,c);}
};
 
 
 
 
 
 
 
int main()
{
 
}
Беда в том что компилятор ругается на реализацию функции void check, мол нельзя использовать там структуру Srep, но почему же нельзя когда я в начале класса сделал объявление её, а после описания класса описал её так чего же тогда компилятору не так? + так же компилятор ругается на исключение Rangee, хотя мне тоже непонятно почему, ведь оно тоже было выше объявлено и определено.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 04:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru