Author: Gerd Isenberg
Date: 00:37:17 01/06/06
Go up one level in this thread
On January 05, 2006 at 18:33:58, Alexander Kure wrote:
>On January 05, 2006 at 13:04:29, Mathieu Pagé wrote:
>
>>Hi, I want to push OO to it's limit in order to get cleaner code. Here is what I
>>want to do :
>>
>>
>>class CSquare
>> {
>> private:
>> unsigned int m_uiSquareIndex;
>> public :
>> // the next 3 functions allow CSquare to be used as an unsigned int in
>> // arithmetic operations.
>> inline CSquare(unsigned int);
>> inline CSquare operator=(unsigned int);
>> inline operator unsigned int();
>>
>> // The next 2 functions are why i'd like to use OOP to make the
>>manipulation
>> // of squares clearer.
>> unsigned int GetColumn()
>> {
>> return m_uiSquareIndex % 8;
>> };
>>
>> unsigned int GetRow()
>> {
>> return m_uiSquareIndex / 8;
>> };
>> };
>>
>>
>>This way I can use CSquare like this :
>>
>>
>>CSquare csq(A1)
>>csq += 8; // One row higher. csq is now equat to A2.
>>csq.GetRow(); // Will return 1 (0 based index)
>>csq.GetColumn(); // will return 0
>>
>>
>>
>>I think that with basic compiler optimisations like inlining this code will
>>bring no overhead in my engine. I already asked some friends about it and they
>>seem to think like me, but are not sure.
>>
>>Since it's CC related and there is some good programmers monitoring this board I
>>though I would ask here.
>>
>>What is your opinion about this?
>>
>>Mathieu Pagé
>
>
>Hi Mathieu,
>
>Following are a few suggestions:
>
>1) You should declare the following functions const:
>
> operator unsigned int() const;
> unsigned int GetColumn() const;
> unsigned int GetRow() const;
>
>2) An additional constructor would be convenient:
>
> CSquare(unsigned int file, unsigned int row);
>
>Then you would need another conversion function:
>
> unsigned int ToSquare(unsigned int file, unsigned int row) const;
>
>3) Instead of low-levely maipulating a square by means of operator+=() you could
>declare the following high-level functions in class CSquare:
>
> void Up();
> void Down();
> void Left();
> void Right();
> void Next();
> void Previous();
Isn't it better to return a reference for this functions, to cascade several
directions in one expression? What about throwing an out of board exception?
>
>4) You could also declare other convenient functions outside of class CSquare:
>
> bool IsAdjacent(const CSquare&, const CSquare&);
while polymorphism is a nice thing to have, this function may also be member of
CSquare.
try
{
if ( sq1.right().down().isAdjacent(sq2) )
....
}
catch (OutOfBoardException e)
{
printf ("oups %s", e.getErrorString());
}
;-)
Gerd
>
>5) In your program you could do something like the following:
>
> CSquare sq1(E4); // e4
> CSquare sq2(3, 3); // d4
>
> sq1.Right();
> sq1.Up();
> sq1.Left();
> sq1.Down();
> sq1.Next();
> sq1.Previous();
>
> bool adj = IsAdjacent(sq1, sq2);
>
>
>Greetings
>Alex
This page took 0.01 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.