Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71

Работа с классами

13.05.2011, 22:16. Показов 2810. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите,

создал класс

Code
1
2
3
4
5
6
7
8
9
10
11
class Person
{
private:
... 
public:
    static int count;
    void set()
    {
        count++;
    }
};
вопрос: как в процедуре tmain мне взять (обратиться) переменную count ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.05.2011, 22:16
Ответы с готовыми решениями:

Работа с классами
Наверно классическая задачка для тех, кто только начинает изучать классы. Есть группы и студенты. Проблема в том, что до меня не доходит,...

Работа с классами
Привет!!! Есть задачка: "Определите класс Oper, содержащий идентификатор типа ld (string или C-строка) и операцию (указатель на...

Работа с классами
Почему может вывестись здесь ошибка? #include <iostream> #include <stdlib.h> #include <time.h> #include <math.h> #include...

34
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
14.05.2011, 13:08  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Jtalk Посмотреть сообщение
Я не нашел в вашем файле ни одной строчке, где Person::count присваивалось бы значение.
Какой пункт конкретно выбираете при выводе "абракадабры" и верного? Там много всего, лень весь switch перебирать.
case 2
0
95 / 81 / 3
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 13:28
Цитата Сообщение от fen1ksss Посмотреть сообщение
case 2
Потому что вы добавляете записи с 0, а считываете с 1, наверное. Я честно пытался вникнуть, но мне это слабо удалось.

Вообще, по-хорошему это следует переписать. Взять std::vector, запихать в него все Person и работать с ним. И избавиться от статических членов - статика для "тематических" методов и предопределений (например, npos в std::basic_string), а не для счетчиков.

А еще в классах class область видимости по умолчанию - private, и первый private из него можно безопасно убрать. А вот в классах struct по умолчанию public.

Не по теме:

А еще я нашел замечательный момент:

C++
1
2
3
4
int get_god()
{
    return god;
}
Аминь

1
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
14.05.2011, 14:05  [ТС]
Цитата Сообщение от Jtalk Посмотреть сообщение
Потому что вы добавляете записи с 0, а считываете с 1, наверное. Я честно пытался вникнуть, но мне это слабо удалось.

Вообще, по-хорошему это следует переписать. Взять std::vector, запихать в него все Person и работать с ним. И избавиться от статических членов - статика для "тематических" методов и предопределений (например, npos в std::basic_string), а не для счетчиков.

А еще в классах class область видимости по умолчанию - private, и первый private из него можно безопасно убрать. А вот в классах struct по умолчанию public.

Не по теме:

А еще я нашел замечательный момент:

C++
1
2
3
4
int get_god()
{
    return god;
}
Аминь

Спасибо за помощь, разобрался, просто счетчик count++ из void set() перенес в мэйн как Person::count++

Добавлено через 16 минут
Последний вопрос, если переменная в public описана как static int, то вне класса инициализировать ее как int Person::count=0; а потом в мэйне использовать как Person::count, а как быть для переменных не static?
0
95 / 81 / 3
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 14:10
Цитата Сообщение от fen1ksss Посмотреть сообщение
Последний вопрос, если переменная в public описана как static int, то вне класса инициализировать ее как int Person::count=0; а потом в мэйне использовать как Person::count, а как быть для переменных не static?
С чем конкретно быть - с инициализацией или доступом?
Для инициализации можно использовать списки инициализации у конструкторов. Для доступа используется оператор ".".
0
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
14.05.2011, 14:15  [ТС]
ну вот если я в классе описываю в public просто int count без static, тогда уже как то по другому к нему обращаться в мэйне?
0
95 / 81 / 3
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 14:20
Цитата Сообщение от fen1ksss Посмотреть сообщение
ну вот если я в классе описываю в public просто int count без static, тогда уже как то по другому к нему обращаться в мэйне?
Цитата Сообщение от Jtalk
Для доступа используется оператор ".".
А вообще, обычно для обращения к нестатическим полям класса используют обертки get()/set().
0
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
14.05.2011, 14:56  [ТС]
Цитата Сообщение от Jtalk Посмотреть сообщение
А вообще, обычно для обращения к нестатическим полям класса используют обертки get()/set().
по заданию создать функцию, в которую передавать объекты

Добавлено через 32 минуты
есть допустим опять же класс
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Person
{
public:
    int a;
    void set()
    {
        int b=2*a;
    }
}
 
void func()
{
    Person c;
    c.set();
    count << b;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    func()
}
в чем ошибаюсь?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
14.05.2011, 15:10
fen1ksss, во всём. b - локальная переменная функции set(). В ней она создаётся, а по её завершению - уничтожается. func() ничего об этой b не знает. Пример сеттера и геттера в простом классе:

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
#include <iostream>
 
class Foo
{
public:
    Foo(int foo):
    m_foo(foo)
    {
    }
 
    void set_foo(int foo)
    {
        m_foo = foo;
    }
 
    int get_foo() const
    {
        return m_foo;
    }
 
private:
    int m_foo;
};
 
int main()
{
    Foo bar(10);
 
    std::cout << bar.get_foo() << std::endl;
 
    bar.set_foo(5);
 
    std::cout << bar.get_foo() << std::endl;
 
    return 0;
}
0
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
14.05.2011, 15:48  [ТС]
как тогда сделать return на указатель на 2-умерный массив

если опишу
Code
1
2
3
4
5
6
7
8
9
10
11
12
class Foo
{
public:
     
    int get_foo() const
    {
        return ***m_foo;
    }
 
private:
   int ***m_foo;
};
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
14.05.2011, 17:41
fen1ksss, а вот этого лучше не делать. Возвращать ссылки/указатели на скрытые данные - дурной тон, иначе зачем вообще их скрывать?
А вообще, если от вопроса отойти - возвращать указатель на двумерный массив (т.е. тройной указатель) так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Foo
{
public:
 
    // ...
 
    int ***get_foo() const
    {
        return m_foo;
    }
 
    // ...
 
private:
    int ***m_foo;
};
1
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
14.05.2011, 19:37  [ТС]
а как вызывать?

Code
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    Foo f;
    for (int i=0; i<3; i++)
        {
            for (int j=0; j<3; j++)
            {
                cout << (*f.get_foo())[i][j];
            }
            cout << "\n";
        }
}
?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
14.05.2011, 20:10
fen1ksss, да, так. Но для ваших целей правильней и в идейном отношении, и в отношении удобства было бы перегрузить оператор [].
0
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
14.05.2011, 20:35  [ТС]
данный кусочек выдает ошибку Exception class EAccessViolation with message 'Access Violation'.

и в f.get_foo() не такое значение как просто в m_foo через метод

значит все так ошибка есть где то
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
14.05.2011, 22:40
Не знаю, зачем вам понадобился именно указатель на двумерный массив. Вот пример с двумерным динамическим массивом:

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
#include <iostream>
 
class Foo
{
public:
    Foo(size_t rows, size_t cols):
    m_rows(rows),
    m_cols(cols)
    {
        m_foo = new int *[m_rows];
 
        for (size_t i = 0; i < m_rows; ++i)
        {
            m_foo[i] = new int [m_cols];
            
            for (size_t j = 0; j < m_cols; ++j)
                m_foo[i][j] = i * 10 + j + 1;
        }
    }
 
    ~Foo()
    {
        for (size_t i = 0; i < m_rows; ++i)
            delete [] m_foo[i];
 
        delete [] m_foo;
    }
 
    int **get_foo() const
    {
        return m_foo;
    }
 
private:
    int **m_foo;
    size_t m_rows;
    size_t m_cols;
};
 
int main()
{
    const size_t rows = 3, cols = 3;
    Foo bar(rows, cols);
 
    for (size_t i = 0; i < rows; ++i)
    {
        for (size_t j = 0; j < cols; ++j)
            std::cout << bar.get_foo()[i][j] << "  ";
 
        std::cout << std::endl;
    }
 
    return 0;
}
1
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
15.05.2011, 14:12  [ТС]
разобрался, спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.05.2011, 14:12
Помогаю со студенческими работами здесь

работа с классами
прошу помощи с лабой, вообще вкурить немогу что и как делать:\ Комплексное число, задаваемое своей вещественной и мнимой...

Работа с классами
Класс соревнование. В каждом соревновании по три участника и произвольное число туров. После проведения туров объявляется победитель. ...

Работа с классами
Не знаю как правильно задать вопрос, поэтому приведу пример. У меня есть класс матрица как лучше реализовать операцию сложения матриц? Я...

Работа с классами
Помогите решить задачу с использованием классов Дан текст. необходимо удвоить каждый символ в этом тексте, включая пробелы.

Работа с классами
Здравствуйте. Есть код, компиляция происходит нормально, Dev-C++ не выдаёт никаких ошибок. Но когда запускаю программу и начиная там...


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru