Welcome to the { mindfrost82.com } forums.

You are currently viewing our boards as a guest which gives you limited access to view most discussions and access our other features. By joining our free community you will have access to post topics, communicate privately with other members (PM), respond to polls, upload content and access many other special features. Registration is fast, simple and absolutely free so please, join our community today!

If you have any problems with the registration process or your account login, please contact contact us.

Go Back   { mindfrost82.com } > Gadget Corner > Tech Newsgroups > Programming > C++

Reply
 
LinkBack Thread Tools Search this Thread Display Modes
  #1 (permalink)  
Old 08-26-2008, 04:18 AM
Nitesh
 
Posts: n/a
Which design in better? (Also posted in comp.lang.c++)

Objects of type X are basic building blocks of my application and
there are a few functions which return XHandle (typedef X** XHandle).
The task at hand needs to use a couple of these functions and then
iterate over X objects.
Because its done frequently and it separates iteration from task-at-
hand'logic we decided to create iterator.

Assuming the availability of functions GetXHandleSize(XHandle) and
DisposeXHandle(XHandle) there are two alternatives.

<b>Option1:</b> Using simple inheritance
class XHandleIterator {
public:
XHandleIterator(void) : mHandle(0L), mCount(0) {}
~XHandleIterator() { if (mHandle != 0L) DisposeXHandle(mHandle); }

bool Done(void) { return mCount > 0; }
// Pre-increment operator
XHandleIterator& operator++(void) { --mCount; return *this; } // Am
iterating over backwards
// Post-increment operator..
// De-referencing operator
X& operator *(void) { return (*mHandle)[mCount-1]; }
protected:
XHandle mHandle;
int mCount;

};

class XHandleIteratorOne : public XHandleIterator {
public:
XHandleIteratorOne(SomeType obj) {
// Creates XHandle someway. Assigns to mHandle and mCount

}
};

class XHandleIteratorTwo : public XHandleIterator {
XHandleIteratorTwo(SomeType obj) {
// Creates XHandle in another way. Assigns to mHandle and mCount
}

};

<b>Option2:</b> Policy based design
template<typename HandleCreator>
class XHandleIterator {
public:
XHandleIterator (SomeType obj) : mHandle(0L), mCount(0)
{
HandleCreator::Create(obj, &mHandle);
mCount = GetXHandleSize(mHandle)/sizeof(X);
}
~XHandleIterator() { if (mHandle != 0L) DisposeXHandle(mHandle); }
bool Done(void) { return mCount > 0; }
// Pre-increment operator
XHandleIterator& operator++(void) { --mCount; return *this; }
// Post-increment operator...
// De-referencing operator
X& operator *(void) { return (*mHandle)[mCount-1]; }
private:
XHandle mHandle;
int mCount;

};

struct XHandleCreator1 {
static void Create(SomeType obj, XHandle *handle) {
// Creates XHandle someway. Assigns to handle
}

};

struct XHandleCreator2 {
static void Create(SomeType obj, XHandle *handle) {
// Creates XHandle in another way. Assigns to handle
}

};

typedef XHandleIterator<XHandleCreator1> XHandleIteratorOne;
typedef XHandleIterator<XHandleCreator2> XHandleIteratorTwo;

I am confused over which is the right way to do in this case with all
stipulations stated at the top. The main thing I like about 2nd one is
that mHandle and mCount are private.
Please comment on which of the above alternative is better?

Thanks
Nitesh

--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]

Reply With Quote
  #2 (permalink)  
Old 08-26-2008, 04:46 PM
Alberto Ganesh Barbati
 
Posts: n/a
Re: Which design in better? (Also posted in comp.lang.c++)

Nitesh ha scritto:
> Objects of type X are basic building blocks of my application and
> there are a few functions which return XHandle (typedef X** XHandle).
> The task at hand needs to use a couple of these functions and then
> iterate over X objects.
> Because its done frequently and it separates iteration from task-at-
> hand'logic we decided to create iterator.
>
> Assuming the availability of functions GetXHandleSize(XHandle) and
> DisposeXHandle(XHandle) there are two alternatives.
>
> <snip>
>
> Please comment on which of the above alternative is better?
>


None of them suits my programming style. Instead of using multiple
classes, I would go for one iterator class and multiple "factory" free
functions, for example:

class XHandleIterator {
public:
XHandleIterator(XHandle h, int c) : mHandle(h), mCount(c) {}
/* ... */
private:
XHandle mHandle;
int mCount;
};

XHandleIterator MakeIterator1(SomeType obj)
{
return XHandleIterator(/* compute mHandle and mCount here */);
}

XHandleIterator MakeIterator2(SomeType obj)
{
return XHandleIterator(/* compute mHandle and mCount here */);
}

Just my opinion,

Ganesh

--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]

Reply With Quote
  #3 (permalink)  
Old 08-26-2008, 04:51 PM
Dave Harris
 
Posts: n/a
Re: Which design in better? (Also posted in comp.lang.c++)

niteshchordiya@gmail.com (Nitesh) wrote (abridged):
> Objects of type X are basic building blocks of my application and
> there are a few functions which return XHandle (typedef X**
> XHandle).
> The task at hand needs to use a couple of these functions and then
> iterate over X objects.
> Because its done frequently and it separates iteration from task-at-
> hand'logic we decided to create iterator.


I don't see why you can't have a single iterator class with a suitable
constructor:

XHandleIterator::XHandleIterator( XHandle handle, int count );

and then various functions that return such iterators:

XHandleIterator makeIterator( SomeType obj );

Your first design introduces this function via a derived class, and your
second design makes it a policy, but why can't it just be a plain simple
function?

-- Dave Harris, Nottingham, UK.

--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]

Reply With Quote
Reply

  { mindfrost82.com } > Gadget Corner > Tech Newsgroups > Programming > C++


Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are Off
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT. The time now is 03:38 PM.


Powered by vBulletin, Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.1.0 ©2007, Crawlability, Inc.
© 1999-2008 mindfrost82.com v11.0


Sponsors:
Loans | Personal Loans | Equity Release | Mobile Phone | Gas Suppliers



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114