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

0 głosów
765 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,460 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ź 1,062 wizyt
0 głosów
1 odpowiedź 635 wizyt
pytanie zadane 24 stycznia 2016 w C i C++ przez Whynotpeter Nowicjusz (140 p.)
0 głosów
6 odpowiedzi 816 wizyt
pytanie zadane 22 września 2015 w C i C++ przez rafalmagician Obywatel (1,340 p.)

93,631 zapytań

142,556 odpowiedzi

323,056 komentarzy

63,139 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2900p. - dia-Chann
  2. 2870p. - DziarnowskiJ
  3. 2827p. - Łukasz Piwowar
  4. 2783p. - raydeal
  5. 2758p. - Adrian Wieprzkowicz
  6. 2713p. - rucin93
  7. 2579p. - Łukasz Eckert
  8. 2523p. - Maurycy W
  9. 2459p. - CC PL
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1851p. - Mariusz Fornal
  13. 1811p. - rafalszastok
  14. 1600p. - Rafał Trójniak
  15. 1588p. - Tomasz Bielak
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

Kursy INF.02 i INF.03
...