• 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?

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
661 wizyt
pytanie zadane 2 czerwca 2021 w C i C++ przez Mavimix Dyskutant (8,420 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 2021 przez tangarr Mędrzec (155,140 p.)
wybrane 4 czerwca 2021 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 2021 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 2021 przez tangarr Mędrzec (155,140 p.)
Święta racja
+1 głos
odpowiedź 2 czerwca 2021 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 2021 przez tkz Nałogowiec (42,020 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 2021 przez Oscar Nałogowiec (29,340 p.)
edycja 4 czerwca 2021 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

+1 głos
2 odpowiedzi 360 wizyt
0 głosów
0 odpowiedzi 275 wizyt
0 głosów
1 odpowiedź 138 wizyt
pytanie zadane 17 kwietnia 2019 w PHP przez Ksiaze Snu Nowicjusz (120 p.)

93,188 zapytań

142,204 odpowiedzi

322,028 komentarzy

62,516 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2817p. - dia-Chann
  2. 2769p. - Łukasz Piwowar
  3. 2759p. - Łukasz Eckert
  4. 2704p. - Tomasz Bielak
  5. 2678p. - Łukasz Siedlecki
  6. 2666p. - rucin93
  7. 2627p. - CC PL
  8. 2485p. - Marcin Putra
  9. 2418p. - Michal Drewniak
  10. 2367p. - Adrian Wieprzkowicz
  11. 2317p. - Mikbac
  12. 2156p. - Anonim 3619784
  13. 2127p. - Michał Telesz
  14. 1733p. - rafalszastok
  15. 1628p. - Dominik Łempicki (kapitan)
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...