Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
SKS-65
5 / 5 / 4
Регистрация: 18.10.2011
Сообщений: 187
1

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

19.03.2013, 22:14. Просмотров 1184. Ответов 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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2013, 22:14
Ответы с готовыми решениями:

Только константное статическое поле НЕ МОЖЕТ быть поле членом класса !
class CCoords { static const float rate = 1.0f; // ОШИБКА !!! bool ...

Статическое поле класса, имеющее тип того же класса
Всем доброго времени суток. Как известно, поля класса могут быть ссылками,...

Почему метод класса затирает статическое поле
Добрый день :) Я учу самостоятельна с++. Сейчас разбираю тему классы. Вот у...

Статическое поле класса: подсчет количества созданных объектов
Задание: Дополнить один из классов статическим полем, которое будет считать...

Как создать неопределенное (т.е. не ограниченное в коде) количество экземпляров класса?
Если кратко, опишу задачу так. Есть баланс предприятия - &quot;срез&quot; показателей,...

8
Why so seriouS
44 / 44 / 12
Регистрация: 12.03.2013
Сообщений: 167
19.03.2013, 22:17 2
Покажите весь код, со всеми файлами!
0
SKS-65
5 / 5 / 4
Регистрация: 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();
}
0
fjay69
87 / 87 / 17
Регистрация: 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; 
}
0
Why so seriouS
44 / 44 / 12
Регистрация: 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; 
}
2
fjay69
87 / 87 / 17
Регистрация: 26.10.2012
Сообщений: 248
19.03.2013, 22:31 6
Цитата Сообщение от Why so seriouS Посмотреть сообщение
Здесь объект не создается?
}[/CPP]
В том то и дело, что создаётся. Конечно, потом он уничтожается, но stcount-то у нас статический!
Пожалуй, будет лучше прописать в деструкторе класса stcount--
2
SKS-65
5 / 5 / 4
Регистрация: 18.10.2011
Сообщений: 187
19.03.2013, 23:57  [ТС] 7
Всё понял,спасибо

Добавлено через 1 час 11 минут
а с деструктором пишет 1 экземпляр класса(
0
Why so seriouS
44 / 44 / 12
Регистрация: 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();
}
1
SKS-65
5 / 5 / 4
Регистрация: 18.10.2011
Сообщений: 187
20.03.2013, 00:24  [ТС] 9
у меня после того как x=x*4; начинает выдавать что 1 экземпляр,не понимаю в чём дело,вроде всё также

Добавлено через 6 минут
Why so seriouS, скопировал ваш код,тоже 1 выдаёт,может это как то от компилятора зависит
0
20.03.2013, 00:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.03.2013, 00:24

Статическое поле
Помогите с такой проблемой. Программа нормально компилится, но возвращается,...

Мое константное статическое поле только что было использовано до того как оно создалось?
В названии темы уже понятно, думаю, что у меня за проблема. Я...

Массив экземпляров класса
Доброго времени суток уважаемые форумчане. Возник вопрос: как заполнять массив...


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

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

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