Vraag : Perfecte taakexploitant 1

Hello,

How zou ik perfecte taakexploitant voor deze klasse moeten maken?

class TAAA: openbare TSuperAAA
{
TBBB* b1_;
   TBBB* b2_;
};
TBBB is monomorphic en b1_, b2_ punt something.

Antwoord : Perfecte taakexploitant 1

>> vooral wanneer Infinity08: schreef dat de waarborg niet nodig in echt systeem (als ik begreep) is.

Nr, bedoelde ik niet dat een waarborg niet nodig is. Wat ik in antwoord op de post zei van de sfeer was dat ik verschillend het behandelen van foutenvoorwaarden dan zijn benadering verkies.

Er zijn twee benaderingen hier (ik heb mijn eigen persoonlijke gedachten ook toegevoegd):

(a) probeer om de taakexploitant te schrijven om het voorwerp in een geldige staat voor elk mogelijk scenario te verlaten. Dit is fundamenteel onmogelijk, of uiterst hard ten minste. Er zijn teveel variabelen in kwestie, en teveel mogelijk foutenscenario. Additionaly, dit soort benadering voegt beperkingen aan toe wat de code kan doen, wat niet in veel gevallen wenselijk is.

(b) vermijd de toegevoegde ingewikkeldheid die met de vorige benadering komt, en stel in plaats daarvan de verantwoordelijkheid aan de roepende code uit. Het mechanisme van uitzonderingen is volkomen geschikt voor dat. Voorts is het gewoonlijk de roepende code die beste kent hoe te om een fout (één van beiden door om het te bevestigen, het te proberen te negeren, elegant te ontbreken, enz.) te behandelen, zodat een andere reden is om deze benadering te verkiezen.

De tweede benadering is wat ik voor het algemene geval adviseer, omdat het flexibeler is, en gemakkelijker uit te voeren, en wanneer behoorlijk gedaan, verliest u om het even wat met achting niet aan codeveiligheid.
De eerste benadering is nuttig in bepaalde specifieke gevallen, maar u zult snel begraven in ingewikkeldheid worden als u probeert om het overal te gebruiken heh.



>> Mijn inspiratie voor het maken van deze post is

Het is een aardig artikel, en het behandelt inderdaad veel van de valkuilen met taakexploitanten.


>> I en was wat benieuwd correct antwoord voor dat is.

U zult opmerken dat het artikel met één van de correcte manieren begint om een taakexploitant te benaderen. Het enige verschil met de code die ik vroeger heb gepost, is dat hun taakexploitant behoorlijk na zich schoonmaakt voor het geval dat de geheugentoewijzing ontbreekt.

Dat is goed, maar niet volledig noodzakelijk. De vuilverbrandingsoven van de klassen wordt ontworpen om een voorwerp schoon te maken, zodat verkies ik die verantwoordelijkheid daar te verlaten, in plaats van uit het uitspreiden van het helemaal over de methodes van de klassen.

Tegen het eind van het artikel, worden de verschillende benaderingen ook besproken.


Opnieuw gaand over mijn vroegere code, niettemin bevlekte ik één fout. De „schrapping b1_; de“ lijn zou door „b1_ moeten gevolgd te zijn = 0; “ lijn (zo ook voor b2_). Schijnt Ik een beetje te snelle heh typte. Zo, wordt het:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
TAAA& TAAA:: operator= (const taaa TAAA&) {
    TSuperAAA:: operator= (taaa);                   // vraag de taakexploitant voor de basisklasse
    als (dit! = &taaa) {                          // controle voor zelftaak
        schrapping b1_;
        b1_ = 0;
        b1_ = nieuwe TBBB (taaa.b1_);
        schrapping b2_;
        b2_ = 0;
        b2_ = nieuwe TBBB (taaa.b2_);
    }
    terugkeer *this;
}
Andere oplossingen  
 
programming4us programming4us