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

VPS Starter Arubacloud
0 głosów
449 wizyt
pytanie zadane 2 czerwca 2021 w C i C++ przez Mavimix Dyskutant (8,390 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 (154,780 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 (154,780 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,000 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,290 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 287 wizyt
0 głosów
0 odpowiedzi 143 wizyt
0 głosów
1 odpowiedź 112 wizyt
pytanie zadane 17 kwietnia 2019 w PHP przez Ksiaze Snu Nowicjusz (120 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...