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

93,604 zapytań

142,527 odpowiedzi

322,991 komentarzy

63,089 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

Kursy INF.02 i INF.03
...