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

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

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

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

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

Подскажите,

создал класс

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

Работа С Классами - C++
Привет Всем , Перехожу С делфи ))) Вот никак не пойму Вот Эту хрень в нутри класса Обрывок из струпа ...

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

работа с классами в С++ - C++
Пусть есть class.срр, в котором описан класс MyClass{ public: int i; ... } Есть файл main.cpp, в нем я использую...

Работа с классами в С++ - C++
Доброго всем дня.У меня возникла проблема с освоением языка C++ , сейчас пишу курсовую на этом языке, и ещё не совсем всё понимаю, но книги...

Работа с классами - C++
Составить описание объектного типа TMatr, что обеспечивает размещение матрицы произвольного размера с возможностью изменения числа строк и...

работа с классами - C++
помогите пожалуйста написать программу на C++: Создать класс Complex для работы с комплексными числами,который должен содержать два...

34
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 11:52 #16
Цитата Сообщение от fen1ksss Посмотреть сообщение
если записываю между классом и мэйном
Код
int Person::count=0;
, а потом использую Person::count для обращению к count, программа компилируется, только при 1 вводе выводит абракадабру, а при последующих, все как и должно быть, я так понимаю что то еще нужно описать
Покажите этот исправленный код - у меня вышеприведенный пример работает (GCC).
0
fen1ksss
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
14.05.2011, 11:52  [ТС] #17
вот что получается
0
Вложения
Тип файла: rar Lab5 защита.rar (4.11 Мб, 7 просмотров)
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 12:37 #18
Цитата Сообщение от fen1ksss Посмотреть сообщение
вот что получается
C++
1
for (int i=1; i<=Person::count; i++)
Почему вы считаете с единицы? Person::count будет инициализирован нулем, и ни одной итерации цикла не будет.
0
fen1ksss
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
14.05.2011, 13:00  [ТС] #19
Цитата Сообщение от Jtalk Посмотреть сообщение
C++
1
for (int i=1; i<=Person::count; i++)
Почему вы считаете с единицы? Person::count будет инициализирован нулем, и ни одной итерации цикла не будет.
если int Person::count=1; то по идее должен быть 1 проход цикла
C++
1
for (int i=1; i<=Person::count; i++)
, а он выводит 1 абракадабру, а 2 верный
0
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 13:07 #20
Цитата Сообщение от fen1ksss Посмотреть сообщение
если int Person::count=1; то по идее должен быть 1 проход цикла
C++
1
for (int i=1; i<=Person::count; i++)
, а он выводит 1 абракадабру, а 2 верный
Я не нашел в вашем файле ни одной строчке, где Person::count присваивалось бы значение.
Какой пункт конкретно выбираете при выводе "абракадабры" и верного? Там много всего, лень весь switch перебирать.
0
fen1ksss
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
14.05.2011, 13:08  [ТС] #21
Цитата Сообщение от Jtalk Посмотреть сообщение
Я не нашел в вашем файле ни одной строчке, где Person::count присваивалось бы значение.
Какой пункт конкретно выбираете при выводе "абракадабры" и верного? Там много всего, лень весь switch перебирать.
case 2
0
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;
}
Аминь

1
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?
0
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?
С чем конкретно быть - с инициализацией или доступом?
Для инициализации можно использовать списки инициализации у конструкторов. Для доступа используется оператор ".".
0
fen1ksss
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
14.05.2011, 14:15  [ТС] #25
ну вот если я в классе описываю в public просто int count без static, тогда уже как то по другому к нему обращаться в мэйне?
0
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 14:20 #26
Цитата Сообщение от fen1ksss Посмотреть сообщение
ну вот если я в классе описываю в public просто int count без static, тогда уже как то по другому к нему обращаться в мэйне?
Цитата Сообщение от Jtalk
Для доступа используется оператор ".".
А вообще, обычно для обращения к нестатическим полям класса используют обертки get()/set().
0
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()
}
в чем ошибаюсь?
0
silent_1991
Эксперт С++
4993 / 3051 / 149
Регистрация: 11.11.2009
Сообщений: 7,038
Завершенные тесты: 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;
}
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;
};
0
silent_1991
Эксперт С++
4993 / 3051 / 149
Регистрация: 11.11.2009
Сообщений: 7,038
Завершенные тесты: 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;
};
1
14.05.2011, 17:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2011, 17:41
Привет! Вот еще темы с ответами:

Работа с классами - C++
Здравствуйте, я здесь первый раз, если что извините, за неккоректность, ввода или задания вопроса Я написал (например): class Figure...

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

Работа с классами - C++
Здравствуйте! Вот у меня есть класс Team team.h#pragma once #include &lt;string&gt; using namespace std; class Team{ public: ...

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


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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