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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 178
#1

Нюанс в работе с классом - C++

11.02.2013, 00:56. Просмотров 1072. Ответов 29
Метки нет (Все метки)

задача такая создать класс для работы с множествами
и реализовать в нём функции для объединения разности множеств и т.д
если я запонляю поля класса так как в коде
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
#include <iostream>
#include <iomanip>
 
#define const 2
 
using namespace std;
 
int i;
 
class Set
{
public:
    void show();
    void unions();
    void razn();
    void intersection();
    void prenadl();
    ~Set();
private:
    int *A;
    int n;
};
 
 
void Set::show()
{
    cout<<"Введите размерность множества \n";
    cin>>n;
    cout <<"Заполните множество \n";
    A=new int[n];
    for (i=0;i<n;i++)
    {
        cin>>*(A+i);    
    }
    cout<<"Вы ввели следующее множество\n";
    for (i=0;i<n;i++)
    {
        cout<<*(A+i)<<" ";      
    }
    cout<<endl;
}
 
 
Set ::~Set(){
    cout<<"Деструктор\n";
}
int main(){
    setlocale(LC_ALL,"");
    cout<<"Введите "<<const<<" множества \n";
    Set *obj;
    obj=new Set[const];
    for (i=0;i<const;i++){
    obj[i].show();
    }
    system("pause");
    return 0;
}
то как потом обратится к записанным полям что объединить элементы А obj[1] с элементами А obj[2]
или нужно заранее создавать два множества(массива)и над ними проводить операции?
ps по форумам ответа не нашел,подобной темы тоже,в справочная литература которую обычно использую не дала ответа на этот вопрос)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2013, 00:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нюанс в работе с классом (C++):

Не вызывается деструктор при работе с классом - C++
Здравствуйте! Не подскажете почему при работе с классом Деструктор не вызывается???? Вот код: #define _CRTDBG_MAP_ALLOC ...

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

Ошибка в работе с классом "очередь" - C++
Скажите пожалуйста, почему указатель на хвост очереди после инициализации всегда направлен в NULL, а на голову в адрес 158? (через...

Swith - нюанс - C++
Такой вот вопрос: как сделать так, что бы при неправильном вводе пользователя какой-либо строки, вопрос о повторении ввода не выбивался...

Нюанс с dynamic_cast: может ли указанное приведение типов быть корректным? - C++
Может ли такое приведение типов (второй dynamic_cast) быть корректным?:class A {public: virtual ~A() {}}; class B : private virtual A...

Проблема с классом - C++
Доброе времени суток...у меня проблема в создании класса - динамического массива! проблема в изминении определённого элемента и вывода на...

29
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 178
23.02.2013, 15:56  [ТС] #16
nonedark2008, если делать так как вы говорите то возникает проблемы при передаче объектов,и получается передать либо кол-во объектов либо размерность объекта
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
#include <iostream>
 
using namespace std;
 
class Set
{
    int *arr;
    int razm;
    
public:
    void input();
    void output();
    void sum(int n,const Set &obj);
 
};
 
 
void Set::input(){
    cin>>razm;
    arr=new int[razm];
    for (int i=0;i<razm;i++)
    {
        cin>>arr[i];
    }
}
 
void Set::sum(int n,const Set &obj){
    int *sumarray=new int[razm+razm];
    for (int i=0;i<n;i++)
    {
        sumarray+=obj[i];
    }
    
 
}
 
void Set::output(){
    for (int i=0;i<razm;i++)
    {
        cout<<arr[i];
    }
    cout<<endl;
}
 
int main(){
    setlocale(LC_ALL,"");
    int n;
    cin>>n;
    Set *obj=new Set[n];
    for (int i=0;i<n;i++)
    {
        obj[i].input();
    }
    for (int i=0;i<n;i++)
    {
        obj[i].output();
    }
    system("pause");
    return 0;
}
в строке
C++
1
sumarray+=obj[i];
ошибка
error C2676: бинарный "[": "const Set" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
0
nonedark2008
914 / 653 / 135
Регистрация: 28.07.2012
Сообщений: 1,764
23.02.2013, 18:19 #17
Посомтри типы элементов, где происходит присваивание - явное несоответствие.
Еще раз повторюсь, забей пока на множества. Тебе нужно сделать класс динамического массива - по нему примеров должно быть достаточно. А уже на основе него нужно делать класс множества.
0
NeonLost
Пес войны
75 / 86 / 3
Регистрация: 23.02.2012
Сообщений: 653
23.02.2013, 20:49 #18
мне кажется или на этом месте
C++
1
 obj[i].output();
должно быть
C++
1
 obj[i]->output();
Добавлено через 6 минут
и я не догнал...почему ты используешь скобки, если ты их не перегрузил?
C++
1
sumarray+=obj[i];
0
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
23.02.2013, 21:46 #19
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Еще раз повторюсь, забей пока на множества. Тебе нужно сделать класс динамического массива - по нему примеров должно быть достаточно. А уже на основе него нужно делать класс множества.
А нельзя пользоваться vector в качестве динамического массива и с его помощью реализовать класс множество, который просто следит за уникальностью в нем элементов?
0
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 178
24.02.2013, 17:55  [ТС] #20
ITcrusader, использовать и можно только вот в рамки не входит,нужно ограничится только,классами ну и шаблонами классов максимум.

Добавлено через 3 часа 3 минуты
а если использовать вектор как это упростит задачу?
0
nonedark2008
914 / 653 / 135
Регистрация: 28.07.2012
Сообщений: 1,764
24.02.2013, 17:58 #21
Цитата Сообщение от Vlad_ Посмотреть сообщение
а если использовать вектор как это упростит задачу?
Не придется реализовывать свой класс динамического массива для хранения элементов множества, не придется реализовывать методы для добавления/удаления/объединения/поиска элементов.
0
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
24.02.2013, 19:22 #22
Цитата Сообщение от Vlad_ Посмотреть сообщение
а если использовать вектор как это упростит задачу?
Ну, скажем так, даже не вектор лучше, а список, думаю. Просто он абсолютно подходит для решения задачи, реализует, как написал уже nonedark2008, все операции. Остается просто воспользоваться его реализацией, добавив лишь контроль над уникальностью в нем элементов. Т.е. создать тот же list, но без дубликатов.
0
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 178
26.02.2013, 00:52  [ТС] #23
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
typedef __int16 int16_t;
typedef unsigned __int16 uint16_t;
 
#include <iostream>
#include <string>
 
using namespace std;
 
class Set {
public:
    typedef int16_t ValueType;
    typedef uint16_t UnsignedValueType;
    typedef unsigned int StorageType;
    Set()
        : data_size_((1 << (sizeof(ValueType) * 8)) / (sizeof(StorageType) * 8)),
        data_(new StorageType[data_size_]) {
            for (int i = 0; i < data_size_; ++i)
                data_[i] = 0;
    }
    Set(const Set &other)
        : data_size_(other.data_size_),
        data_(new StorageType[data_size_]) {
            for (size_t i = 0; i < data_size_; ++i)
                data_[i] = other.data_[i];
    }
    ~Set() {
        //cout<<"Деструктор\n";
        delete [] data_;
    }
    int Has(ValueType value) const {
        UnsignedValueType uvalue = static_cast<UnsignedValueType>(value);
        return data_[uvalue / (sizeof(StorageType) * 8)] &
            (1 << (uvalue % (sizeof(StorageType) *8 )));
    }
    void Add(ValueType value) const {
        UnsignedValueType uvalue = static_cast<UnsignedValueType>(value);
        data_[uvalue / (sizeof(StorageType) * 8)] |=(1 << (uvalue % (sizeof(StorageType) * 8)));
    }
    void Remove(ValueType value) const {
        UnsignedValueType uvalue = static_cast<UnsignedValueType>(value);
        data_[uvalue / (sizeof(StorageType) * 8)] &=
            ~(1 << (uvalue % (sizeof(StorageType) * 8)));
    }
    bool IsEmpty() const {
        for (size_t i = 0; i < data_size_; ++i)
            if (data_[i] != 0)
                return false;
        return true;
    }
    size_t DataSize() const {
        return data_size_;
    }
    Set Intersection(const Set &other) {
        Set result;
        for (int i = 0; i < data_size_; ++i)
            result.data_[i] = data_[i] & other.data_[i];
        return result;
    }
    Set Union(const Set &other) {
        Set result;
        for (int i = 0; i < data_size_; ++i)
            result.data_[i] = data_[i] | other.data_[i];
        return result;
    }
    Set Complement(const Set &other) {
        Set result;
        for (int i = 0; i < data_size_; ++i)
            result.data_[i] = data_[i] & ~other.data_[i];
        return result;
    }
 
    void check() {
        int prov;
        cout<<"Введите число для проверки\n";
        cin>>prov;
        for (UnsignedValueType i = 0; i <= (1 << (sizeof(ValueType) * 8) - 1); ++i){
            
            if (ValueType(i)=prov){
                cout<<"Пренадлежит\n";
                break;
            }
            else cout<<"Не пренадлежит\n";
            break;
        }
    }
 
    Set &operator=(const Set &other) {
        if (&other != this) {
            data_size_ = other.data_size_;
            delete [] data_;
            data_ = new StorageType[data_size_];
            for (size_t i = 0; i < data_size_; ++i)
                data_[i] = other.data_[i];
        }
        return *this;
    }
    void PrintAllNumbers() {
        for (UnsignedValueType i = 0; i <= (1 << (sizeof(ValueType) * 8) - 1); ++i)
            if (Has(i))
                cout<<" "<<ValueType(i);
        cout<<endl;
    }
private:
    size_t data_size_;
    StorageType *data_;
};
 
int main() {
    setlocale(0,"");
    do{
        system("CLS");
    Set a, b, c;
    int n;
    cout<<"Введите рамерность множеств\n";
    cin>>n;
    for (int i = 0; i < n; ++i) a.Add(rand() % 10);
    for (int i = 0; i < n; ++i) b.Add(rand() % 10);
 
    cout<<"Сгенерированное множество a: ";
    a.PrintAllNumbers();
    cout<<"Сгенерированное множество b: ";
    b.PrintAllNumbers();
 
    cout<<("Объединение : ");
    a.Union(b).PrintAllNumbers();
 
    cout<<"Пересечиние: ";
    a.Intersection(b).PrintAllNumbers();
 
    cout<<"Разность: ";
    a.Complement(b).Union(b.Complement(a)).PrintAllNumbers();
 
    cout<<"Проверка на пренадлежность \n";
    cout<<"Для множества a \n";
    a.check();
    cout<<"Для множества b \n";
    b.check();
    
    system("pause");
    }while(true);
    return  0;
}
можете помочь отладить функциюю check потому что он единственная которая не работает,точнее она работает но не корректно ,почему то всё ей подходит
0
nonedark2008
914 / 653 / 135
Регистрация: 28.07.2012
Сообщений: 1,764
26.02.2013, 01:22 #24
Цитата Сообщение от Vlad_ Посмотреть сообщение
можете помочь отладить
Я пока не понимаю даже задумки... Что за ValueType? StorageType? Что это за махинации с размерами типов? Зачем это все? Я пока не вижу в этом смысла >_>
0
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 178
26.02.2013, 01:38  [ТС] #25
nonedark2008, это пример с форума в котором как вы и говорили динам класс использовался,я нашел по вашей рекомендации правда я и сам не совсем врубаюсь в смысл)
C++
1
2
3
private:
    size_t data_size_;
    StorageType *data_;
а принцип что мы храним тип,размерность,значения,с ними проводим операции а память выделяем с запасом,что бы на верняка хватило.
0
nonedark2008
914 / 653 / 135
Регистрация: 28.07.2012
Сообщений: 1,764
26.02.2013, 02:06 #26
Vlad_, если честно то что вы привели - нечто не то... Простой динамический класс содержит: указатель на массив, максимальный размер массива, кол-во элементов в массиве, и кол-во на которое увеличивается массив, если мы его до конца заполним. Вам нужно что-то такое...
0
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 178
26.02.2013, 02:13  [ТС] #27
nonedark2008, ну даже дело не в этом,он ведь работает как поправить функцию check для меня главнее,я уже вожусь с этой задачей 2 неделю.
0
nonedark2008
914 / 653 / 135
Регистрация: 28.07.2012
Сообщений: 1,764
26.02.2013, 02:24 #28
Vlad_, хоть оно и работает, но проблема в том, что оно работает хрен знает как... И реализация отличается от общепринятой. Вот тебя спросят, что это за параша с типами, почему класс сдеалн не через шаблоны и т.п.? сможешь ли ответить? Если ты узнаешь как хранятся элементы множества в массиве, тогда уж и сможешь написать функцию check.
0
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 178
26.02.2013, 02:35  [ТС] #29
nonedark2008, я как бы пытался сделать через шаблоны,но запутался
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
#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std;
 
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_union (InputIterator1 first1, InputIterator1 last1,
    InputIterator2 first2, InputIterator2 last2,
    OutputIterator result)
{
    while (true)
    {
        if (first1==last1) return copy(first2,last2,result);
        if (first2==last2) return copy(first1,last1,result);
 
        if (*first1<*first2) { *result = *first1; ++first1; }
        else if (*first2<*first1) { *result = *first2; ++first2; }
        else { *result = *first1; ++first1; ++first2; }
        ++result;
    }
}
 
 
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_intersection (InputIterator1 first1, InputIterator1 last1,
    InputIterator2 first2, InputIterator2 last2,
    OutputIterator result)
{
    while (first1!=last1 && first2!=last2)
    {
        if (*first1<*first2) ++first1;
        else if (*first2<*first1) ++first2;
        else {
            *result = *first1; first2;
            ++result; ++first1; ++first2;
        }
    }
    return result;
}
 
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_difference (InputIterator1 first1, InputIterator1 last1,
    InputIterator2 first2, InputIterator2 last2,
    OutputIterator result)
{
    while (first1!=last1 && first2!=last2)
    {
        if (*first1<*first2) { *result = *first1; ++result; ++first1; }
        else if (*first2<*first1) ++first2;
        else { ++first1; ++first2; }
    }
    return copy(first1,last1,result);
}
 
 
 
 
int main(){
    setlocale(0,"");
    int first[] = {5,10,15,20,25};
    int second[] = {50,40,30,20,10};
    vector<int> v(10);                      
    vector<int>::iterator it;
 
    sort (first,first+5);     
    sort (second,second+5); 
 
    it=set_difference (first, first+5, second, second+5, v.begin());
    
    v.resize(it-v.begin());                      
 
    cout << "The difference has " << (v.size()) << " elements:\n";
    for (it=v.begin(); it!=v.end(); ++it)
        cout << ' ' << *it;
    cout << '\n';
 
    system("pause");
    return 0;
}
0
nonedark2008
914 / 653 / 135
Регистрация: 28.07.2012
Сообщений: 1,764
26.02.2013, 03:22 #30
Цитата Сообщение от Vlad_ Посмотреть сообщение
я как бы пытался сделать через шаблоны,но запутался
Ужас ^_^
Блин, конечно у меня есть реализованный в давности динамический массив, но он тебе не подойдет. Там слишком много всего >_> Мои переопределения типов, мои исключения, комментарии на англ... Я вообще считаю, что первым делом нужен динамический массив: либо делать самому, либо воспользоваться std::vector - нужно у препода уточнить. А используя это - реализовывать класс множества. Я не знаю, что требует преподаватель, но считаю, что нужно делать именно так(Уточни если можешь).
Т.е. нужно иметь хранилище для множества, а далее имея это хранилище - реализовывать множество.
У хранилища должны быть обычные операции: добавление элемента, удаление элемента, получение элемента по номеру. Класс множества должен содержать в себе хранилище, метод для добавления элемента в множество с проверкой на наличие такого же элемента в этом множестве, удаление элемента из множества, поиск элемента в множестве ну и еще что-то. Далее буду функция объединения двух множеств: какой-нить union, который объединяет два множества. Т.е. просто вызывается для первого множества функция добавления для каждого элемента второго. Пересечение - пробегаем по каждому элементу первого и ищем его во втором, если найден - оставляем, не найден - удаляем. Ну и т.д.

Добавлено через 2 минуты
Вообще динамический массив - не обязателен в таком виде, как я упоминал. Будет достаточно любого хранилища с таким функционалом. Например, список. Может сделаешь через него? По идее через список будет легче...

Добавлено через 9 минут
Короче, советую сначало сделать через std::vector. Сделать так, чтобы работало. Сохранить, а реализовать свою замену для std::vector(например список).
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2013, 03:22
Привет! Вот еще темы с ответами:

работа с классом - C++
Разработайте класс, моделирующий рациональные числа как несократимые дроби, включающий числитель Num и знаменатель Den. Предусмотрите...

Ошибка с классом. - C++
Здравствуйте. Возникла проблема с классом. http://codepad.org/XpTrKcAC В чем может быть проблема?

Задача с классом - C++
Здравствуйте. Имеется следующий класс. class CClass { private: int *arr; const int size;

Работа с классом - C++
Приветствую.Начал изучать с++ , возникла вот такая программка : в классе целых чисел между соседними отрицательными вставить нолик ) Буду...


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

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

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