• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czy takie deklarowanie obiektu jest poprawne?

0 głosów
98 wizyt
pytanie zadane 2 czerwca w C i C++ przez Mavimix Dyskutant (7,800 p.)

Mam taki kod:

/* Plik myObject1.h

#include "Object2.h"

class myObject1
{
public:
	myObject1(int a);
	~myObject1();
	void clearDatas();
};

*/

#include "myObject1.h"

//Czy to deklarowanie obiektu liczy sie jako globalne, czy jest to zapis poprawny?
//Da sie w jakis sposob stworzyc obiekt w konstruktorze, zeby byl widoczny we wszystkich metodach?
Object2 mySecObject;

myObject1::myObject1(int a)
{
	mySecObject.methodOne(a);
}

myObject1::~myObject1()
{
	clearDatas();
}

void myObject1::clearDatas()
{
	mySecObject.deleteValues();
}

Tak jak w komentarzu: czy deklaracja obiektu mySecObject w tym miejscu liczy się jako globalna (a jak wiadomo lepiej unikać deklaracji globalnych)? A może jest to jak najbardziej poprawny zapis? Da się w jakiś sposób zadeklarować obiekt mySecObject w konstruktorze myObject1 tak, żeby można było go używać w innych metodach tej klasy?

2 odpowiedzi

+1 głos
odpowiedź 2 czerwca przez tangarr VIP (136,900 p.)
wybrane 4 czerwca przez Mavimix
 
Najlepsza

mySecObject jest zmienną globalną w danej jednostce kompilacji (w jednym pliku cpp)
Jeżeli chcesz, żeby ta zmienna była dostępna wewnątrz twojej klasy to możesz ją tam umieścić.
 

#include "Object2.h"
 
class myObject1
{
private:
    Object2 mySecObject;
public:
    myObject1(int a);
    ~myObject1();
    void clearDatas();
};

Każda instancja klasy myObject1 będzie posiadać własną zmienną mySecObject.

Jeżeli chcesz aby zmienna mySecObject była wspólna dla wszystkich instancji klasy myObject1 to musisz ją uczynić statyczną.

//
// plik nagłówkowy
//
#include "Object2.h"
 
class myObject1
{
private:
    static Object2 mySecObject;
public:
    myObject1(int a);
    ~myObject1();
    void clearDatas();
};


//
// plik źródłowy
//
myObject1::Object2 mySecObject;

 

 


 

1
komentarz 2 czerwca przez swetroniusz Użytkownik (540 p.)

Chyba wkradł się mały błąd w pliku źródłowym w drugim bloku kodu.

Zamiast

myObject1::Object2 mySecObject;

Powinno być

Object2 myObject1::mySecObject;

 

komentarz 3 czerwca przez tangarr VIP (136,900 p.)
Święta racja
+1 głos
odpowiedź 2 czerwca przez swetroniusz Użytkownik (540 p.)

Jeśli zamierzasz użyć mySecObject tylko i wyłącznie w metodach klasy myObject1 - możesz użyć prywatnego pola statycznego.

Coś w tym stylu:

// Plik myobject1.h
class myObject1
{
    static Object2 mySecObject;  //zostaw jako prywatne; będziemy tego używali tylko w metodach
};

// Plik myobject1.cpp
Object2 myObject1::mySecObject;

Jest to moim zdaniem bardziej poprawne niż deklarowanie zwykłej zmiennej globalnej - nasze mySecObject, mimo że statyczne, to bardziej enkapsulowane - mają do tego dostęp tylko metody myObject1, a więc ciężej coś zepsuć.

Mimo to, unikałbym zmiennych statycznych - nie są thread safe, a poza tym często można się bez nich obejść. Czy dałoby radę po prostu podać referencję do konstruktora myObject1, i to z niej korzystać w metodach? O tak:

// Plik myObject1.h
class myObject1
{
public:
    myObject1(int a, Object2& secObject);
private:
    Object2& SecObjectRef;
};

// Plik myObject1.cpp
myObject1::myObject1(int a, Object2& secObject):
SecObjectRef(secObject)
{
    SecObjectRef.methodOne(a);  //korzystamy z referencji
}

 

komentarz 3 czerwca przez tkz Nałogowiec (40,800 p.)

Nagłówki powinny być najczystsze jak to tylko możliwe. Skoro coś będzie używane tylko w jednym pliku źródłowym, to tam to zadeklaruj. 

Mimo to, unikałbym zmiennych statycznych - nie są thread safe

Jeżeli modyfikujemy obiekt.

1
komentarz 4 czerwca przez Oscar Pasjonat (19,350 p.)
edycja 4 czerwca przez Oscar

Dodałbym, że statyczne/nie statyczne pole, zmienna globalna albo referencja w obiekcie dokładnie niczym się nie różnią pod względem thread safe. To zupełnie inna para kaloszy - niezależne od siebie czynniki.

Natomiast deklaracja, taka jak w pierwszym, poście powinna być jeszcze uzupełniona słowem static, o ile faktycznie mySecObject nie jest używany poza tym plikiem w którym jest zadeklarowany:

static Object2 mySecObject;

 

Podobne pytania

0 głosów
0 odpowiedzi 55 wizyt
0 głosów
1 odpowiedź 50 wizyt
pytanie zadane 17 kwietnia 2019 w PHP przez Ksiaze Snu Nowicjusz (120 p.)
0 głosów
3 odpowiedzi 149 wizyt
Porady nie od parady
Nie wiesz jak poprawnie zredagować pytanie lub pragniesz poznać którąś z funkcji forum? Odwiedź podstronę Pomoc (FAQ) dostępną w menu pod ikoną apteczki.FAQ

85,212 zapytań

134,029 odpowiedzi

297,158 komentarzy

56,309 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...