CannibalSmith ([info]cannibalsmith) rakstīja [info]koderi kopienā,
@ 2007-09-29 19:34:00

Previous Entry  Add to memories!  Tell a Friend!  Next Entry
C++ klases mainīgo inicializācijas kārtība
Ir klase Room. Ir klase Chair, kuras vienīgais konstruktors ir Chair(Room& room). Ir klase House, kas dara tā:
House
{
protected:
    Room room;
    Chair chair(room);
};
Tā drīkst? Vai room inicializācija ir garantēta pirms chair inicializācijas, ja es room deklarēju pirms chair? Un kā rakstīt, ja es gribu masīvu ar Chair? Ja tā nedrīkst, tad kā man darīt? Es varētu deklarēt Chair* un inicializēt viņu kaudzē House konstruktorā (un attiecīgi dzēst destruktorā), bet man tas neliekas eleganti.


(Ierakstīt jaunu komentāru)


[info]bubu
2007-09-29 21:06 (saite)
Nē, tā nevar, jo tā ir invalīda C++ sintakse. Bet drīkst šādi:
class House
{
public:
    House() : room(), chair(room)   // <--- šeit ir norādīta memberu inicializācijas kārtība
    {
    }

protected:
    Room room;
    Chair chair;
};

Var, protams, arī neinlainot konstruktoru.

(Atbildēt uz šo) (Diskusija)


[info]cannibalsmith
2007-09-29 21:10 (saite)
Vai var inicializēt viņus konstruktora ķermenī, ja man nepatīk izmantot inicializācijas sarakstus? Ķipa
House()
{
room = Room();
chair = Chair(room);
}

(Atbildēt uz šo) (Iepriekšējais) (Diskusija)


[info]bubu
2007-09-29 21:14 (saite)
Inicializēt nevar. Var piešķirt, tieši ar tādu kodu kā tu raksti. Taču tas var izrādīties neefektīvi, jo viena konstruktora izsaukšanas vietā, kā ir mana koda fragmentā, tavā kodā tiks izsaukti divi konstruktori un operator = gan room, gan chair memberam. Ja objekts operē ar lieliem atmiņas daudzumiem, tad notiks lieka atmiņas kopēšana un izdalīšana - neefektīvi.

Inicializēt var tikai konstruktora memberu inicializācijas sarakstā.

(Atbildēt uz šo) (Iepriekšējais)


[info]bubu
2007-09-29 21:11 (saite)
Ah un par Chair masīvu - nekas cits kā definēt Chair* vai arī Chair'am izveidot vēlvienu bezargumentu konstruktoru tev neatliks.

No manuālas dzēšanas gan var izvairīties, ja izmantosi kādu no gudrajiem pointeriem - std::auto_ptr vai kādu smart pointeri (piemēram boost::smart_ptr).

(Atbildēt uz šo) (Diskusija)


[info]cannibalsmith
2007-10-05 20:15 (saite)
Ļauns veids, kā uztaisīt masīvu ar objektiem bez defaultajiem konstruktoriem. Rīri thought excericse, protams. :)
class House
{
    House();
    ~House();
    Room room;
    Chair* chair;
}
House::House()
{
    chair = (Chair*) malloc(sizeof(Chair) * n)
    for (int i = 0; i < n; i++)
    {
        new(chair + i) Chair(room);
    }
}
House::~House()
{
    for (int i = 0; i < n; i++)
    {
        delete chair + i;
    }
    free(chair);
}

(Atbildēt uz šo) (Iepriekšējais) (Diskusija)


[info]bubu
2007-10-05 20:22 (saite)
delete chair + i;
vietā ir jāraksta
chair[i].~Chair();

Es katrā ziņā neko šādu nerekomendētu lietot.

(Atbildēt uz šo) (Iepriekšējais)


Neesi iežurnalējies. Iežurnalēties?