CannibalSmith ([info]cannibalsmith) rakstīja [info]koderi kopienā,
@ 2007-11-24 20:00:00

Previous Entry  Add to memories!  Tell a Friend!  Next Entry
īpašību simulācija iekš C++
Ķipa getSomething() funkcijas bieži izmanto read-only klases mainīgo nolasīšanai. Bet es tak varu darīt šādi:
class Boo
{
public:
	Boo() : read_only_property(private_variable) { }
	const int& read_only_property;
private:
	int private_variable;
};
Bet ar šādu sintaksi es iegūstu pilnu property (kā, piemēram, C#) simulāciju. No ārpuses izskatīsies kā mainīgais, bet es iekšpusē varu ielikt izsaukuma apstrādi. Vienīgi ārpusē neuzrādīsies vērtības patiesais tips. Es gan varētu nosaukt viņu, piemēram, Tilpums_int...
class Pudele
{
public:
	Tilpums tilpums;
	class Tilpums
	{
	public:
		int operator =(int value) { tilpums = value; }
		operator int() { return tilpums; }
	private:
		int tilpums;
	};
};
Komentāri? Cik jēdzīgas vai nejēdzīgas ir šīs tehnikas? Vai tām ir pielietojums? Vai ir vēl kāds iemesls tās nelietot bez tā, ka tās ir pilnīgi ārpus vispār pieņemtā kodēšanas stila?

Edit: izlaboju kļūdas.


(Lasīt komentārus) - (Ierakstīt jaunu komentāru)


[info]bubu
2007-11-24 23:01 (saite)
Neprecīzi pateicu - gribēju teikt, ka esi aizliedzis defaulto konstruktoru, jo tas nezin kā var pārkopēt const referenci (tai neko piešķirt ta nevar!). Protams, ja pats implementē visām klasēm to operator = tad viss rullēs.
Ah jā - pareiz tu saki par to Tilpums::operator = atgriežamo vērtību. int ir jāatgriež.
Kā atgriezt divas vērtības? Vienkārši:
typedef std::pair<int, float> MyTwoValues;

MyTwoValues func()
{
    return std::make_pair(1, 15.0f);
}
boost::tuple ļauj atgriez līdz pat 10 vērtības :) Un vienmēr var arī padot funkcijas argumentos ne-const references uz vērtībām, kurās jāatgriež kautkas:
bool getNextThing(Thing& thing);
...
Thing thing;
while (getNextThing(thing))
{
    thing->doSomething();
}
Kāpēc lai divi argumenti būtu pretrunā ar set funkciju?
class Window
{
   void setPosition(int x, int y);
};

Es jau biju domājis tieši šādu gadījumu - kad datus veido vairāki aprakstāmie lielumi, nevis viens vienīgs. Slikts piemērs par to pudeles izmēru bij..

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


[info]cannibalsmith
2007-11-28 18:46 (saite)
Tas ir labs stils, tā darīt ar pair un tuple? It īpaši, kad mainīgie nav loģiski saistīti.

Ja atgriežamās vērtības ir argumenti (neconst references), tad tādu konstrukciju nevar likt lielākās izteiksmēs un ir obligāti jādeklarē mainīgais, kur glabāt rezultātu. Tas tak ir slikts stils, ne?
Ērti: doStuff(getValue());
Neērti: { int val; getValue(val); doStuff(val); }

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


[info]bubu
2007-11-28 20:18 (saite)
Labs stils noteikti neskaitās rakstīt sarežģītus funkciju izsaukumus:
doStuff(getValue(value1), getOtherValue(value2));

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


(Lasīt komentārus) -

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