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

Konstruktory i destruktory klasy będącej wskaźnikiem na klasę

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
667 wizyt
pytanie zadane 18 lutego 2020 w C i C++ przez Damianek Obywatel (1,020 p.)
edycja 18 lutego 2020 przez Damianek

Cześć,

próbuję zrozumieć część poniższego kodu, a dokładnie:

CFooSmartPtr(CFoo* pFoo) : m_pWskaznik(pFoo) { cout << "Konstruktor klasy CFooSmartPtr" << endl; }

Czy mógłby mi ktoś to przetłumaczyć? Rozumiem, że CFooSmartPtr(CFoo* pFoo) to konstruktor klasy CFooSmartPtr, którego argumentem formalnym jest CFoo* pFoo, czyli wskaźnik na klasę CFoo.

natomiast co oznacza to dalej po dwukropku?

Program działa także jak zamiast powyższego wstawię coś takiego:

CFooSmartPtr(CFoo*wsk) { m_pWskaznik = wsk; cout << "Konstruktor klasy CFooSmartPtr" << endl; }

Czy są to analogiczne działania?

#include <iostream>

using namespace std;

class CFoo {

public:

// konstruktor i destruktor

int power;
int dex;
int wisdom;

    CFoo () {

    cout << "Konstruktor klasy CFoo" << endl;

    power = 100;
    dex = 120;
    wisdom = 80;

    }

    ~CFoo () {

    cout << "Destruktor klasy CFoo" << endl;

    }




};

class CFooSmartPtr
{
private:

CFoo* m_pWskaznik; // m_pWskaznik jest wskaźnikiem na obiekt klasy CFoo

public:
// konstruktor i destruktor

CFooSmartPtr(CFoo* pFoo) : m_pWskaznik(pFoo) { cout << "Konstruktor klasy CFooSmartPtr" << endl; }
~CFooSmartPtr() { if (m_pWskaznik) delete m_pWskaznik; cout << "Destruktor klasy CFooSmartPtr" << endl; }

//-------------------------------------------------------------

// operator dereferencji
CFoo& operator*() { return *m_pWskaznik; }
// operator wyłuskania
CFoo* operator->() { return m_pWskaznik; }

};


int main () {

try
{
CFooSmartPtr pFoo = new CFoo;

cout << pFoo->power << endl;
cout << pFoo->dex << endl;
cout << pFoo->wisdom << endl;

// ...
throw "Cos sie stalo";
// niszczony obiekt pFoo i wywoływany destruktor CFooSmartPtr

} catch (const char* e) {

cout << e << endl;

}

string temp;
getline(cin,temp);



}

 

2 odpowiedzi

0 głosów
odpowiedź 18 lutego 2020 przez tangarr Mędrzec (155,140 p.)

Operacje po dwukropku to bezpośrednia inicjalizacja zmiennych klasy.

class Osoba {
private:
   std::string mImie;
   std::string mNazwisko;
   const int mRokUrodzenia;
public:
    Osoba(const char* imie, const char* nazwisko, int rokUrodzenia) :
        mImie(imie),
        mNazwisko(nazwisko),
        mRokUrodzenia(rokRurodzenia) 
    {
    }
}

W ten sposób unikasz niepotrzebnego wywoływania konstruktorów domyślnych pól składowych klasy. Tylko w ten sposób możesz ustawić wartość stałych pól klasy (patrz mRokUrodzenia)

0 głosów
odpowiedź 19 lutego 2020 przez Bondrusiek Maniak (61,440 p.)

Tak jak przedmówca powiedział po dwukropku występuje inicjalizacja zmiennych klasy oraz możesz wywołać odziedziczony konstruktor z klasy bazowej. Taką składnie często wykorzystuje się w frameworku C++/Qt gdzie występuje hierarchia typów. Przykład:

StyledItemDelegate::StyledItemDelegate(QObject *parent) : QStyledItemDelegate(parent)
{
//Ciało konstruktora
}

Jeszcze z rzeczy podstawowych to przy takim typie inicjalizacji powinieneś zachować kolejność deklaracji zmiennych taką samą jak w klasie.

class Osoba {
private:
   std::string mImie;
   std::string mNazwisko;
   const int mRokUrodzenia;
public:
    Osoba(const char* imie, const char* nazwisko, int rokUrodzenia) :
        mRokUrodzenia(rokRurodzenia) ,
       mNazwisko(nazwisko),
        mImie(imie)
    {
//Niezachowana kolejność
    }

Więcej informacji

https://en.cppreference.com/w/cpp/language/initializer_list

Podobne pytania

0 głosów
1 odpowiedź 859 wizyt
0 głosów
1 odpowiedź 530 wizyt
pytanie zadane 24 stycznia 2016 w C i C++ przez Whynotpeter Nowicjusz (140 p.)
0 głosów
6 odpowiedzi 502 wizyt
pytanie zadane 22 września 2015 w C i C++ przez rafalmagician Obywatel (1,320 p.)

93,190 zapytań

142,205 odpowiedzi

322,031 komentarzy

62,518 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2817p. - dia-Chann
  2. 2769p. - Łukasz Piwowar
  3. 2759p. - Łukasz Eckert
  4. 2738p. - CC PL
  5. 2704p. - Tomasz Bielak
  6. 2678p. - Łukasz Siedlecki
  7. 2666p. - rucin93
  8. 2485p. - Marcin Putra
  9. 2418p. - Michal Drewniak
  10. 2367p. - Adrian Wieprzkowicz
  11. 2317p. - Mikbac
  12. 2239p. - Michał Telesz
  13. 2156p. - Anonim 3619784
  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!

...