Заједнички елементи класа

Појам и дефинисање заједничких елемената класа

Понекада је добро да се класа пројектује тако да има и заједничке елементе, односно промењиве и функције које су заједничке за све објекте дате класе. Такве функције и класе називају се заједнички елементи, а сви остали чланови су сопствени.

Осим ако се експлицитно не наведе да је неки члан заједнички, онда је он подразумевано сопствени.

Заједнички подаци чланови

При креирању објеката класе, за сваки објекат се креира посебан комплет података чланова. Ипак, могуће је дефинисати податке чланове за које постоји само један примерак за целу класу, тј. за све објекте класе.

Овакви чланови називају се статичким члановима, и декларишу се помоћу речи static.

static tip ime;

Сваки приступ статичком члану из било ког објекта класе значи приступ истом заједничком члану-објекту.

Статички члан класе има животни век као и глобални статички објекат, односно настаје на почетку програма и траје до краја програма. Уопште, статички члан класе има сва својства глобалног статичког објекта, осим области важења класе и контроле приступа.

Статички члан мора да се иницијализује посебном декларацијом ван декларације класе и тада се обраћање оваквом члану ван класе врши се преко оператора `::`.

 int X::i=5;

Статичком члану може да се приступи из функције чланице, али и ван функција чланица, чак и пре формирања иједног објекта класе (јер статички члан настаје као и глобални објекат), наравно уз поштовање права приступа.

Тада му се приступа преко оператора `::`.

Заједнички чланови се углавном користе када сви примерци једне класе треба да деле неку заједничку информацију, нпр. када представљају неку колекцију, односно када је потребно имати их „све на окупу и под контролом“.

Заједнички чланови смањују потребу за глобалним објектима и тако повећавају читљивост програма, јер је могуће ограничити приступ њима, за разлику од глобалних објеката. Заједнички чланови логички припадају класи и „упаковани“ су у њу.

Пример: Посматраћемо класу мачка која има особине име, боја и број ногу. Како је познато име и боја се обично разликују, али је број ногу сталан, па га можемо прогласити за заједничку особину.

#include<iostream>
#include<cstdlib>
using namespace std;
class macka
{
private:
char *ime; // сопствена особина
char *boja; // сопствена особина
static int broj_nogu; // заједничка особина
public:
macka() // подразумевани конструктор
{ime = "bela";boja = "crna";}
macka(char *i, char *b) // конструктор
{ime = i;boja = b;}
~macka() {} // деструктор
void prikazi() // сопствена метода
{cout<<"Macka "<<ime<<" je "<<boja<<" boje i ima "<<broj_nogu<<" noge"<<endl;}
};
// Иницијализацију заједничке промењиве морамо извршити ван класе.
// Пошто је ово глобална промењива може јој се приступити ван било које
// функције, чак и пре него што креирамо неки објекат овог типа
int macka::broj_nogu = 4;

#include <iostream>
#include"macka.h"
using namespace std;
int main()
{
// Креирамо два објекта типа maсka
macka pera("Pera","bela"), mika("Mika","Turundzasta");
// Приказујемо особине креираних објеката
pera.prikazi();
mika.prikazi();
cout << endl;
return 0;
}

Заједничке функције чланице

И функције чланице могу да се декларишу као заједничке за целу класу, додавањем речи static испред декларације функције чланице.

static tip ime_funkcije(argumenti) {}

Статичке функције чланице имају сва својства глобалних функција, осим области важења и контроле приступа. Оне не поседују показивач this и не могу непосредно (без помињања конкретног објекта класе) користити нестатичке чланове класе. Могу непосредно користити само статичке чланове те класе.

Статичке функције чланице се могу позивати за конкретан објекат (што нема посебно значење), али и пре формирања иједног објекта класе, преко оператора `::`.

Пример: Написати класу правоугаоник која има особине странице а и б и заједнички елемент који ће бројати колико има креираних објеката овог типа, као и заједничку методу која враћа број креираних правоугаоника.

#include<iostream>
#include<cstdlib>
using namespace std;
class pravougaonik
{
private:
int a,b; // сопствене особине
static int broj_pravougaonika; // заједничке особине
public:
pravougaonik() //конструктор
{a = 0;b = 0;broj_pravougaonika++;}
pravougaonik(int x, int y) //конструктор
{a = x;b = y;broj_pravougaonika++;}
~pravougaonik() {}; //деструктор
void Unesi_stranice() //сопствена метода
{cout << "unesi stranice pravougaonika" << endl;cin >> a >> b;}
static int broj() // заједничка метода
{return broj_pravougaonika;}
};
// Иницијализацију заједничке промењиве морамо извршити ван класе.
// Пошто је ово глобална промењива може јој се приступити ван било које
// функције, чак и пре него што креирамо неки објекат овог типа
int pravougaonik::broj_pravougaonika = 0;

#include <iostream>
#include"pravougaonik.h"
using namespace std;
int main()
{
pravougaonik A, B(3,2), C;
// приступићемо статичкој промењивој преко имена класе
cout <<"ukupno je kreirano "<<pravougaonik::broj()<<" pravougaonika"<< endl;
//Ако пробамо да приступимо заједницкој методи сваког од објекта добијамо:
cout << "objekat A: " << A.broj() << endl;
cout << "objekat B: " << B.broj() << endl;
cout << "objekat C: " << C.broj() << endl;
cout << endl;
return 0;
}

Оставите одговор

Попуните детаље испод или притисните на иконицу да бисте се пријавили:

WordPress.com лого

Коментаришет користећи свој WordPress.com налог. Одјавите се /  Промени )

Google photo

Коментаришет користећи свој Google налог. Одјавите се /  Промени )

Слика на Твитеру

Коментаришет користећи свој Twitter налог. Одјавите се /  Промени )

Фејсбукова фотографија

Коментаришет користећи свој Facebook налог. Одјавите се /  Промени )

Повезивање са %s