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

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

Войти
Регистрация
Восстановить пароль
 
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
#1

Статическое поле,количество экземпляров класса - C++

19.03.2013, 22:14. Просмотров 1033. Ответов 8
Метки нет (Все метки)

Помогите понять,статическое поле stcount считает количество созданных экземпляров класса (объектов),я объявляю всего два объекта а он выводит 3
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
#include "stdafx.h"
#include "iostream"
#include "conio.h"
#include "TTriangle.h"
using namespace std;
void main()
{
    setlocale(LC_ALL,"RUSSIAN");
    TTriangle x(2,4,6); 
 
    cout<<"Первоначальный треугольник - ";
    x.Print();
 
    TTriangle u(4,8,12);
 
    cout<<"\nВторой треугольник - ";
    u.Print();
 
    if (u*x==0)
        cout<<"\nТреугольники не подобны";
    else
        cout<<"\nТреугольники подобны";
 
    x=x*4;
 
    cout<<"\nНовый треугольник - ";
    x.Print();
    cout<<"\n";
 
    cout<<"Количество экземпляров класса : "<<TTriangle::stcount;
    getch();
}
конструктор TTriangle
C++
1
2
3
4
5
TTriangle::TTriangle(int a1,int b1,int c1) 
{
    stcount++;
    a=a1;b=b1;c=c1;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2013, 22:14     Статическое поле,количество экземпляров класса
Посмотрите здесь:

C++ Статическое поле
C++ Как создать неопределенное (т.е. не ограниченное в коде) количество экземпляров класса?
Реализация динамического создания экземпляров класса. C++
C++ Статическое поле класса, имеющее тип того же класса
C++ Добавление экземпляров одного класса в другой класс
C++ Указатель на массив экземпляров класса
C++ Инициализация экземпляров класса из файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
19.03.2013, 22:17     Статическое поле,количество экземпляров класса #2
Покажите весь код, со всеми файлами!
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
19.03.2013, 22:20  [ТС]     Статическое поле,количество экземпляров класса #3
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
#include "stdafx.h"
#include "iostream"
#include "conio.h"
#include "TTriangle.h"
using namespace std;
class TTriangle //класс "Треугольник"
{
    //длины трёх сторон треугольника
private:
        int a;
        int b;
        int c;
public:
    static int stcount; //статическое поле считающего количество созаных экземпляров класса
    bool operator* (TTriangle& value); //перегруженная операция умножения - проверяет подобие 2 треугольников,возвращает true или false
    TTriangle operator* (int value);  //перегруженная операция умножения - увеличивает длину сторон треугольника в заданное кол-во раз
    TTriangle (int a1,int b1,int c1); //конструктор с параметрами
    void Print(); //выводит длины сторон треугольника на экран
};
int TTriangle::stcount=0;
TTriangle::TTriangle(int a1,int b1,int c1)  //конструктор с параметрами
{
    stcount++;
    a=a1;b=b1;c=c1;
}
TTriangle TTriangle::operator* (int value) //перегруженная операция умножения - увеличивает длину сторон треуголника в заданное кол-во раз
{
    TTriangle p(a*value,b*value,c*value);
    return p; 
}
bool TTriangle::operator*(TTriangle& value) //перегруженная операция умножения - проверяет подобие 2 треугольников,возвращает true или false
{
    if (a%value.a==0 && b%value.b==0 && c%value.c==0)
        return true;
    else
        return false;
}
void TTriangle::Print()  //выводит длины сторон треугольника на экран
{
    cout<<a<<" "<<b<<" "<<c;
}
void main()
{
    setlocale(LC_ALL,"RUSSIAN");
    //объявляем треугольник (1)
    TTriangle x(2,4,6); 
 
    //выводим длины сторон треугольника (1)
    cout<<"Первоначальный треугольник - ";
    x.Print();
 
    //объявляем треугольник (2)
    TTriangle u(4,8,12);
 
    //выводим длины сторон треугольника (2)
    cout<<"\nВторой треугольник - ";
    u.Print();
 
    //проверяем подобие треугольников (1) и (2)
    if (u*x==0)
        cout<<"\nТреугольники не подобны";
    else
        cout<<"\nТреугольники подобны";
 
    //увеличиваем длину сторон (1) треугольника
    x=x*4;
 
    //выводим длины сторон треугольника (1)
    cout<<"\nНовый треугольник - ";
    x.Print();
    cout<<"\n";
 
    //выводим количество созданных экземпляров класса
    cout<<"Количество экземпляров класса : "<<TTriangle::stcount;
    getch();
}
fjay69
85 / 85 / 1
Регистрация: 26.10.2012
Сообщений: 248
19.03.2013, 22:23     Статическое поле,количество экземпляров класса #4
C++
1
2
3
4
5
TTriangle TTriangle::operator* (int value) //перегруженная операция умножения - увеличивает длину сторон треуголника в заданное кол-во раз
{
    TTriangle p(a*value,b*value,c*value);
    return p; 
}
Надо заменить на
C++
1
2
3
4
5
6
TTriangle TTriangle::operator* (int value) //перегруженная операция умножения - увеличивает длину сторон треуголника в заданное кол-во раз
{
    this->a=this->a*value;
    this->b=this->b*value;
    this->c=this->c*value; 
}
Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
19.03.2013, 22:24     Статическое поле,количество экземпляров класса #5
Здесь объект не создается?
C++
1
2
3
4
5
TTriangle TTriangle::operator* (int value) 
{
    TTriangle p(a*value,b*value,c*value);
    return p; 
}
fjay69
85 / 85 / 1
Регистрация: 26.10.2012
Сообщений: 248
19.03.2013, 22:31     Статическое поле,количество экземпляров класса #6
Цитата Сообщение от Why so seriouS Посмотреть сообщение
Здесь объект не создается?
}[/CPP]
В том то и дело, что создаётся. Конечно, потом он уничтожается, но stcount-то у нас статический!
Пожалуй, будет лучше прописать в деструкторе класса stcount--
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
19.03.2013, 23:57  [ТС]     Статическое поле,количество экземпляров класса #7
Всё понял,спасибо

Добавлено через 1 час 11 минут
а с деструктором пишет 1 экземпляр класса(
Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
20.03.2013, 00:09     Статическое поле,количество экземпляров класса #8
У меня выводит два.
Кликните здесь для просмотра всего текста
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
//#include "stdafx.h"
#include "iostream"
#include "conio.h"
//#include "TTriangle.h"
using namespace std;
class TTriangle //класс "Треугольник"
{
    //длины трёх сторон треугольника
private:
        int a;
        int b;
        int c;
public:
    static int stcount; //статическое поле считающего количество созаных экземпляров класса
    bool operator* (TTriangle& value); //перегруженная операция умножения - проверяет подобие 2 треугольников,возвращает true или false
    TTriangle operator* (int value);  //перегруженная операция умножения - увеличивает длину сторон треугольника в заданное кол-во раз
    TTriangle (int a1,int b1,int c1); //конструктор с параметрами
    void Print(); //выводит длины сторон треугольника на экран
    ~TTriangle(){--stcount;}
};
 
int TTriangle::stcount=0;
 
TTriangle::TTriangle(int a1,int b1,int c1)  //конструктор с параметрами
{
    stcount++;
    a=a1;b=b1;c=c1;
}
TTriangle TTriangle::operator* (int value) //перегруженная операция умножения - увеличивает длину сторон треуголника в заданное кол-во раз
{
    TTriangle p(a*value,b*value,c*value);
    return p; 
}
bool TTriangle::operator*(TTriangle& value) //перегруженная операция умножения - проверяет подобие 2 треугольников,возвращает true или false
{
    if (a%value.a==0 && b%value.b==0 && c%value.c==0)
        return true;
    else
        return false;
}
void TTriangle::Print()  //выводит длины сторон треугольника на экран
{
    cout<<a<<" "<<b<<" "<<c;
}
int main()
{
    setlocale(LC_ALL,"RUSSIAN");
    //объявляем треугольник (1)
    TTriangle x(2,4,6); 
 
    //выводим длины сторон треугольника (1)
    cout<<"Первоначальный треугольник - ";
    x.Print();
 
    //объявляем треугольник (2)
    TTriangle u(4,8,12);
 
    //выводим длины сторон треугольника (2)
    cout<<"\nВторой треугольник - ";
    u.Print();
 
    //проверяем подобие треугольников (1) и (2)
    if (u*x==0)
        cout<<"\nТреугольники не подобны";
    else
        cout<<"\nТреугольники подобны";
 
    //увеличиваем длину сторон (1) треугольника
    x=x*4;
 
    //выводим длины сторон треугольника (1)
    cout<<"\nНовый треугольник - ";
    x.Print();
    cout<<"\n";
 
    //выводим количество созданных экземпляров класса
    cout<<"Количество экземпляров класса : "<<TTriangle::stcount;
    getch();
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.03.2013, 00:24     Статическое поле,количество экземпляров класса
Еще ссылки по теме:

Почему метод класса затирает статическое поле C++
Пример создания массива экземпляров другого класса C++
Реализовать операторы сравнения двух экземпляров класса (==, !==) C++
C++ Создание массива экземпляров класса с не стандарным конструктором
C++ ошибка при выводе экземпляров класса

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

Или воспользуйтесь поиском по форуму:
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
20.03.2013, 00:24  [ТС]     Статическое поле,количество экземпляров класса #9
у меня после того как x=x*4; начинает выдавать что 1 экземпляр,не понимаю в чём дело,вроде всё также

Добавлено через 6 минут
Why so seriouS, скопировал ваш код,тоже 1 выдаёт,может это как то от компилятора зависит
Yandex
Объявления
20.03.2013, 00:24     Статическое поле,количество экземпляров класса
Ответ Создать тему
Опции темы

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