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

Указатели и счётчик - C++

Восстановить пароль Регистрация
 
Elfenlide
23 / 23 / 1
Регистрация: 15.04.2012
Сообщений: 183
19.09.2012, 23:13     Указатели и счётчик #1
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//class set.h
#include <iostream>
using namespace std;
class Set
{
private:
    char element[100];
    int n;
    int count;
public:
    Set()
    {
        element[0]='\0';
        n = 0;
        count=1;
    }
    Set(char s[])
    {
        strcpy(element,s);
    }
    void getSet();
    void showSet();
};

Кликните здесь для просмотра всего текста
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
// PPvIS_laba_1_t2.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include "class_set.h"
#include <iostream>
using namespace std;
/*---------методы класса Set------------------*/
//Ввод данных
void Set::getSet()
{
    char elem;
    do
    { 
        cout<<"Введите элементы множества(Enter - выход): ";
        cin.sync();
        cin.get(elem);
        if (elem == '\n') 
        {
            cin.sync(); 
            break;
        }
        element[n] = elem;
        n++;
        while (cin.get() != '\n');
    } while (true);
    system("cls");
}
//Вывод данных
void Set::showSet()
{
    cout<<"Множество "<<this->count<<": "<<"{";
    for (int i=0;i<this->n;i++)
        cout<<this->element[i]<<" ";
    cout<<"}"<<" Мощность множества |";
    if(this->n == 0) { cout<<this->n<<"|"<<" - Пустое множество"<<endl; }
    else cout<<this->n<<"|"<<endl;
}
/*--------Прототипы-----------------------*/
void add(Set& A, Set& B);
void show(Set& A, Set& B);
void addElem(Set& elem);
/*------------------Главная функция---------------*/
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0,"");
    Set mnA; Set mnB;
    int choice;
    do 
    {
        cout<<"1.Добавить множества"<<endl;
        cout<<"2.Вывести множества и их мощность"<<endl;
        cout<<"3.Добавить элемент в множество"<<endl;
        cout<<"0.Выход"<<endl;
        cin>>choice;
        switch(choice)
        {
        case 0: exit(1);
        case 1: { add(mnA, mnB); break; }
        case 2: { show(mnA, mnB); break; }
        case 3: { system("cls"); cout<<"1.Множество А\n2.Множество B\n"; 
                    int ch; cin>>ch;
                    switch(ch)
                    {
                    case 1: { mnA.getSet(); break; }
                    case 2: { mnB.getSet(); break; }
                    default: cout<<"Ошибка!"<<endl;
                    } break;
                }
        default: cout<<"Error! Try again.";
        }
    } while (true);
    return 0;
}
/*---------Функции------------------------*/
//Ввод
void add(Set& A, Set& B)
{
    system("cls");
    cout<<"Первое множество: \n";
    A.getSet();
    cout<<"Второе множество: \n";
    B.getSet();
}
//Вывод
void show(Set& A, Set& B)
{
    system("cls");
    A.showSet();
    B.showSet();
}

Две проблемы:
1.Счётчик равен единице у каждого объекта, а нужно чтобы у первого был номер 1 а у второго номер 2.
2. У меня в классе стоит char element[100], а нужно сделать как массив указателей, как-то char *element, и при этом *element это массив символов получается, но я что-то и читал в книге, так и не въехал как оно работает.
Объясните что к чему пожалуйста и помогите доработать.Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2012, 23:13     Указатели и счётчик
Посмотрите здесь:

C++ счётчик
C++ счётчик двойного цикла, без доволнительных переменных
Счётчик до ДР C++
C++ Метод сортировки выбором счётчик количества итераций C++
C++ счётчик
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
no_wearines
 Аватар для no_wearines
52 / 48 / 2
Регистрация: 01.01.2012
Сообщений: 322
19.09.2012, 23:29     Указатели и счётчик #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
//class set.h
#include <iostream>
using namespace std;
class Set
{
private:
    char element[100];
    int n;
    static int count;
public:
    Set()
    {
        element[0]='\0';
        n = 0;
        function_1();
    }
static void function_1()
{
count += 1;
}
    Set(char s[])
    {
        strcpy(element,s);
    }
    void getSet();
    void showSet();
};
 
int Set::count = 0;
массив указателей:

C++
1
char *s_1[2] = {"Hello", "World"};
или динамически

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char **s_1 = new char *[2];
 
s_1[0] = new char[20];
s_1[1] = new char[20];
 
strcpy(s_1[0], "hello");
strcpy(s_1[1], "world");
 
cout<<s_1[0]<<endl<<s_1[1]<<endl;
 
delete [] s_1[0];
delete [] s_1[1];
 
delete [] s_1;
Добавлено через 1 минуту
кстати доступ к статическому объекту класса можно осуществлятьеще до создания объектов

C++
1
cout<<Set::count<<endl;
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.09.2012, 23:38     Указатели и счётчик #3
так не прокатит. это не счетчик объектов, а скорее идентификатор конкретного объекта. идентификатор должен быть нестатическим мембером, который уже может инициализироваться от статического счетчика. с тем, что было предложено функция showSet вместо этого идентификатора будет для всех объектов писать одно и то же значение.
Elfenlide
23 / 23 / 1
Регистрация: 15.04.2012
Сообщений: 183
19.09.2012, 23:50  [ТС]     Указатели и счётчик #4
Цитата Сообщение от no_wearines Посмотреть сообщение
Для счетчика объектов необходимо воспользоваться статическими объектами.
Сделал как вы показали статическим, теперь пишет что у первого и второго множества count=2.А не Множество 1, Множество 2.
Можно подробнее про динамическую память указателя? у вас стоит указатель на указатель, я думла это нужно для массива указателей чтобы сделать потом например матрицу(двумерный массив), а у меня ведь одномерный.

Добавлено через 1 минуту
Цитата Сообщение от DU Посмотреть сообщение
так не прокатит. это не счетчик объектов, а скорее идентификатор конкретного объекта. идентификатор должен быть нестатическим мембером, который уже может инициализироваться от статического счетчика. с тем, что было предложено функция showSet вместо этого идентификатора будет для всех объектов писать одно и то же значение.
Как быть в данной ситуации?Я помню когда однажды писал какую-то прогу то где-то искал такое уже и делал, но не помню где и как(
no_wearines
 Аватар для no_wearines
52 / 48 / 2
Регистрация: 01.01.2012
Сообщений: 322
19.09.2012, 23:52     Указатели и счётчик #5
Я не разбирал код. Счетчик объектов просто принято делать статическим.
Elfenlide
23 / 23 / 1
Регистрация: 15.04.2012
Сообщений: 183
20.09.2012, 00:12  [ТС]     Указатели и счётчик #6
Цитата Сообщение от no_wearines Посмотреть сообщение
Я не разбирал код. Счетчик объектов просто принято делать статическим.
Да, вы правы, но это только в том случае если требуется чтобы счётчик выполнял свою стандартную функцию, и в случае с классами, давал каждому объекту знать о том сколько ещё объектов создано.
Но у меня к сожалению частный случай и в голову не лезет святая мысль на ночь(

Добавлено через 8 минут
И ещё может кто подскажет как удалить элемент из множества?
такой функции ведь вроде нету стандартной для удаления элемента найденного в массиве, или есть?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.09.2012, 00:14     Указатели и счётчик #7
ну вот упрощенный вариант. данные копируются, идентификаторы объектов остаются правильными.
это если я правильно понял предназначение вашего count

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
#include <iostream>
 
class Foo
{
  const int m_id;
  int m_data;
 
public:
  Foo(int data)
    : m_id(NextId())
    , m_data(data)
  {
  }
 
  Foo(const Foo& other)
    : m_id(NextId())
    , m_data(other.m_data)
  {
  }
 
  Foo& operator = (const Foo& other)
  {
    m_data = other.m_data;
    return *this;
  }
 
  void Show() const
  {
    std::cout << "id = " << m_id << "  data = " << m_data << std::endl;
  }
 
private:
  static int NextId()
  {
    static int id = 0;
    ++id;
    return id;
  }
};
 
 
int main()
{
 
  Foo foo1(666);
  Foo foo2(foo1);
  Foo foo3(0);
  foo3 = foo2;
 
  foo1.Show();
  foo2.Show();
  foo3.Show();
 
  return 0;
};
Elfenlide
23 / 23 / 1
Регистрация: 15.04.2012
Сообщений: 183
20.09.2012, 01:01  [ТС]     Указатели и счётчик #8
Цитата Сообщение от DU Посмотреть сообщение
ну вот упрощенный вариант. данные копируются, идентификаторы объектов остаются правильными.
это если я правильно понял предназначение вашего count

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
#include <iostream>
 
class Foo
{
  const int m_id;
  int m_data;
 
public:
  Foo(int data)
    : m_id(NextId())
    , m_data(data)
  {
  }
 
  Foo(const Foo& other)
    : m_id(NextId())
    , m_data(other.m_data)
  {
  }
 
  Foo& operator = (const Foo& other)
  {
    m_data = other.m_data;
    return *this;
  }
 
  void Show() const
  {
    std::cout << "id = " << m_id << "  data = " << m_data << std::endl;
  }
 
private:
  static int NextId()
  {
    static int id = 0;
    ++id;
    return id;
  }
};
 
 
int main()
{
 
  Foo foo1(666);
  Foo foo2(foo1);
  Foo foo3(0);
  foo3 = foo2;
 
  foo1.Show();
  foo2.Show();
  foo3.Show();
 
  return 0;
};
спасибо но как-то это сложновато, чтобы впихивать в мою маленькую программульку) я вручную увеличил) учитывая что у меня больше чем два множества не будет в программе, думаю ничего плохого не случиться)
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.09.2012, 01:05     Указатели и счётчик #9
тогда вообще избавтесь от этого счетчика и перед выводом множества напишите:
C++
1
2
3
4
std::cout << "это множество 1:"<< std::endl;
set1.show();
std::cout << "это множество 2:"<< std::endl;
set2.show();
сами себе сложности придумали
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2012, 01:18     Указатели и счётчик
Еще ссылки по теме:

C++ не работает функция-счётчик
Счётчик нажатия на кнопку C++
C++ Счётчик заданных объектов

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

Или воспользуйтесь поиском по форуму:
Elfenlide
23 / 23 / 1
Регистрация: 15.04.2012
Сообщений: 183
20.09.2012, 01:18  [ТС]     Указатели и счётчик #10
Цитата Сообщение от DU Посмотреть сообщение
тогда вообще избавтесь от этого счетчика и перед выводом множества напишите:
C++
1
2
3
4
std::cout << "это множество 1:"<< std::endl;
set1.show();
std::cout << "это множество 2:"<< std::endl;
set2.show();
сами себе сложности придумали
Да, спасибо, что-то я ночью уже совсем не варю\ целый день сидел над программой, плюнул и начал писать заново)...
Вы не подскажете как удалить элемент из массива? и там выше писали про массив указателей и динамическое выделение памяти под элемент, хотелось бы реализовать это у себя, но что-то с тем что сказано было выше я так и не разобрался. Ошибок много вылетало.
Yandex
Объявления
20.09.2012, 01:18     Указатели и счётчик
Ответ Создать тему
Опции темы

Текущее время: 22:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru