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

Работа с классами - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
fen1ksss
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
13.05.2011, 22:16     Работа с классами #1
Подскажите,

создал класс

Код
class Person
{
private:
...	
public:
	static int count;
	void set()
	{
		count++;
	}
};
вопрос: как в процедуре tmain мне взять (обратиться) переменную count ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2011, 22:16     Работа с классами
Посмотрите здесь:

C++ Работа с классами
Работа с классами C++
C++ Работа с классами.
работа с классами C++
C++ Работа с классами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fen1ksss
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
14.05.2011, 13:08  [ТС]     Работа с классами #21
Цитата Сообщение от Jtalk Посмотреть сообщение
Я не нашел в вашем файле ни одной строчке, где Person::count присваивалось бы значение.
Какой пункт конкретно выбираете при выводе "абракадабры" и верного? Там много всего, лень весь switch перебирать.
case 2
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 13:28     Работа с классами #22
Цитата Сообщение от 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;
}
Аминь

fen1ksss
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
14.05.2011, 14:05  [ТС]     Работа с классами #23
Цитата Сообщение от 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?
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 14:10     Работа с классами #24
Цитата Сообщение от fen1ksss Посмотреть сообщение
Последний вопрос, если переменная в public описана как static int, то вне класса инициализировать ее как int Person::count=0; а потом в мэйне использовать как Person::count, а как быть для переменных не static?
С чем конкретно быть - с инициализацией или доступом?
Для инициализации можно использовать списки инициализации у конструкторов. Для доступа используется оператор ".".
fen1ksss
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
14.05.2011, 14:15  [ТС]     Работа с классами #25
ну вот если я в классе описываю в public просто int count без static, тогда уже как то по другому к нему обращаться в мэйне?
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 14:20     Работа с классами #26
Цитата Сообщение от fen1ksss Посмотреть сообщение
ну вот если я в классе описываю в public просто int count без static, тогда уже как то по другому к нему обращаться в мэйне?
Цитата Сообщение от Jtalk
Для доступа используется оператор ".".
А вообще, обычно для обращения к нестатическим полям класса используют обертки get()/set().
fen1ksss
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
14.05.2011, 14:56  [ТС]     Работа с классами #27
Цитата Сообщение от Jtalk Посмотреть сообщение
А вообще, обычно для обращения к нестатическим полям класса используют обертки get()/set().
по заданию создать функцию, в которую передавать объекты

Добавлено через 32 минуты
есть допустим опять же класс
Код
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()
}
в чем ошибаюсь?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.05.2011, 15:10     Работа с классами #28
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;
}
fen1ksss
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
14.05.2011, 15:48  [ТС]     Работа с классами #29
как тогда сделать return на указатель на 2-умерный массив

если опишу
Код
class Foo
{
public:
     
    int get_foo() const
    {
        return ***m_foo;
    }
 
private:
   int ***m_foo;
};
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.05.2011, 17:41     Работа с классами #30
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;
};
fen1ksss
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
14.05.2011, 19:37  [ТС]     Работа с классами #31
а как вызывать?

Код
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";
		}
}
?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.05.2011, 20:10     Работа с классами #32
fen1ksss, да, так. Но для ваших целей правильней и в идейном отношении, и в отношении удобства было бы перегрузить оператор [].
fen1ksss
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
14.05.2011, 20:35  [ТС]     Работа с классами #33
данный кусочек выдает ошибку Exception class EAccessViolation with message 'Access Violation'.

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

значит все так ошибка есть где то
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.05.2011, 22:40     Работа с классами #34
Не знаю, зачем вам понадобился именно указатель на двумерный массив. Вот пример с двумерным динамическим массивом:

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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2011, 14:12     Работа с классами
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
fen1ksss
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
15.05.2011, 14:12  [ТС]     Работа с классами #35
разобрался, спасибо
Yandex
Объявления
15.05.2011, 14:12     Работа с классами
Ответ Создать тему
Опции темы

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