Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

Reliable class design

Posted on 2000-02-27
6
Medium Priority
?
188 Views
Last Modified: 2013-12-03
Hi dudes,

I'm currently on the learning curve of C++. However, many years of regular C programming leave me with the notion that I may be up to some bad habits... I wonder if you could provide any suggestions...

I'm currently working on a simple hex dump class: It works, but is there a smarter, more bulletproof way of doing it? The way I've designed it is that it takes a constant pointer to a constant byte:

myDump.LookAt((reinterpret_cast<const char * const>(pBuffer)));

Pretty ugly, to say the least. Is it possible to, say, use void pointers to make the LookAt member function accept any type of pointer without the foul casting and no subsequent whining from the compiler?

In addition, the class has these two member functions:

void DumpClass::OutputHex(unsigned char *pszOutput, int nBytesToGet);
void DumpClass::OutputASCII(unsigned char *pszOutput, int nBytesToGet);

These take a pointer to a string and output the corresponding hex dump data to that string, eg.

const int nBytesToGet=16;
char outputbuff[64];
DumpClass myDump;
myDump.LookAt(pSomeLoc);
myDump.OutputHex(outputbuff, nBytesToGet);

It troubles me that it is up to the programmer to make sure that the output buffer is big enough to hold the dump output... What would be a better way?

Since this is really 2 questions, I've doubled the points...

Cheers
0
Comment
Question by:baldrick
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 3
6 Comments
 
LVL 3

Author Comment

by:baldrick
ID: 2563426
Adjusted points to 200
0
 
LVL 22

Accepted Solution

by:
nietod earned 800 total points
ID: 2563460
>> Pretty ugly, to say the least.
Well, there''s not to much that you can do about this.  You are--intentionally--breaking the rules by treating non-character-array data types as character arrays and that is goign to be messy and always a bit risky too.  But that is pretty much unavoidable.  You could use a C-style cast instead of the reinterpret_cast<>.  There is no difference between these except that the reinterpret_cast is uglier and that is intentional.  it is hard to miss and that was the goal.

>> it troubles me that it is up to the programmer
>> to make sure that the output buffer is big
>> enough to hold the dump
>> output... What would be a better way?
Good.  It should trouble you.  You shoudl be prepared to say goodbye to that sort of code and mor importantly to "char *" strings too!  Switch to using a string class, like the STL string.  (Or write your own string class, it is a great learnign experience.)

Then make this procedure return a string.  The string will be as long as is needed to represent the data.  1 character or 10,000 characters.  Much easier for the class's client to use your class that way!  And if the string is reference counted, it is still very efficient to return in this manner.
0
 
LVL 22

Expert Comment

by:nietod
ID: 2563468
An example of this would be the STL's global getline() function this reads a line from a file and returns it in a string.  The string will be as long as is needed to return the line (assuming you don't run out of memory).  I might be 0 characters, 1 character, or 10,000 characters.

In your case you would do something like

string DumpClass::OutputHex(int nBytesToGet = 16)
{
  string S;
  const char *CnvAry = "0123456789ABCDEF";
  while (nBytesToGet--)
  {
     unsigned char Byt = *SomePtr++

     if (S.length())  // If this is not the first character.
        S += ' '; // Add a space after previous char.
     S +=  CnvAry[(Byt >> 4) & 0x0F];
     S+= CnvAry[Byt  & 0x0F];
  }
  return S;
}

Let me know if you have any questions.
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
LVL 3

Author Comment

by:baldrick
ID: 2563669
Thank you for your prompt answer, which has certainly answered my question (I was afraid you'd recommend using the STL, something I've been a bit lax in learning about).

On the first point about getting rid of the casting: I changed the LookAt parameter type to a constant void pointer and the client no longer needs the cast. Is this a safe thing to do?
0
 
LVL 22

Expert Comment

by:nietod
ID: 2564603
Honestly, I wouldn't recommend rushing into the STL. If you are just starting out try doing some of it yourself.  You will learn more and you will also develope an appreciation for the STL if you decide to use it.  (I personally don't use it, except to answer questions here.)  I do recommend you learn ABOUT it at sometime, but not necessarily at the start.  I can't begin to say how important it is to have a good string class and possibly other container classes too, it has so many advantages it would take another 200 points for me to list them, but it doesn't have to be the STL ones.

>> Is this a safe thing to do?
It is not any less safe than what you had.   But basically what you are doing is intrinsically unsafe and may cause problems at times--though you really have no choice.

For example, If you are on a protected mode OS, then this design may be used to try access protected memory or invalid memory addresses and this will result in a crash.  Like if you allocate an object that is 16 bytes in length and try to display it for a length of 32 bytes you don't know what is in the 16 bytes after the object, it may be a protected memory segment and the OS will termiante your app.   Another example might be using this to display the contents of an object that has a virtual base class.  Such an object may not be stored in contiquous bytes in memory (i.e. it may be stored in seperate memory blocks with spaces between tham) so this could be displaying garbage (or again protected memory) when it tries to display parts of the object.
0
 
LVL 3

Author Comment

by:baldrick
ID: 2565883

Once again, thanks for the great advice and valuable insights.
0

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

When writing generic code, using template meta-programming techniques, it is sometimes useful to know if a type is convertible to another type. A good example of when this might be is if you are writing diagnostic instrumentation for code to generat…
C++ Properties One feature missing from standard C++ that you will find in many other Object Oriented Programming languages is something called a Property (http://www.experts-exchange.com/Programming/Languages/CPP/A_3912-Object-Properties-in-C.ht…
The goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
Suggested Courses

618 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question