Re: pointer non-pointer
On Sun, 20 Apr 2008 14:11:53 -0400, Joseph M. Newcomer
<newcomer@flounder.com> wrote:
See below...
On Thu, 17 Apr 2008 16:44:32 -0700, worlman385@yahoo.com wrote:
==== [Non-pointer version] ====
as a rule, for non pointer, as long as I have an object that dont'
need to pass to another function / call another function. I can do the
following (non-pointer) -
Database db;
db.open("user", "pass");
==== [Pointer version] ====
If I need to pass the object to another function then I should use
(pointer) -
Database* db = new Database();
bool flag = openConnection ( db, "user", "pass" );
****
Wrong. If you need to pass the object to another function, your BEST choice is
pass-by-reference:
Database db;
bool flag = openConnection(db, _T("user"), _T("pass"));
(note that 'char' is an obsolete data type and 8-bit character literals should not be used
in modern programming, that is, anything written after 1992)
where the function is
bool someclass::openConnection(Database & db, LPCTSTR username, LPCTSTR password);
A poorer solution is to pass a pointer
Database db;
bool flag = openConnection(&db, _T("user"), _T("pass"));
where the prototype is
bool someclass::openConnection(Database * db, LPCTSTR username, LPCTSTR password);
No place is it written that to pass an object reference to another function you must
allocate it with 'new', and in fact this often represents Worst Possible Practice.
Is the following very old style coding then?
It does use char* and sprintf.
sprintf is not use now aday? only used in C?
==================
_variant_t vtMissing1(DISP_E_PARAMNOTFOUND, VT_ERROR);
void ErrorHandler(_com_error &e, char* ErrStr)
{
sprintf(ErrStr,"Error:\n");
sprintf(ErrStr,"%sCode = %08lx\n",ErrStr ,e.Error());
sprintf(ErrStr,"%sCode meaning = %s\n", ErrStr, (char*)
e.ErrorMessage());
sprintf(ErrStr,"%sSource = %s\n", ErrStr, (char*) e.Source());
sprintf(ErrStr,"%sDescription = %s",ErrStr, (char*)
e.Description());
}
Database::Database()
{
m_Cnn=NULL;
sprintf(m_ErrStr,"NULL POINTER");
}
void Database::GetErrorErrStr(char* ErrStr)
{
sprintf(ErrStr,"%s",m_ErrStr);
}
void Table::GetErrorErrStr(char* ErrStr)
{
sprintf(ErrStr,"%s",m_ErrStr);
}
bool Database::Open(char* UserName, char* Pwd,char* CnnStr)
{
//cnn->Open(strCnn,"sa","sa",NULL);
try
{
HRESULT hr;
hr = m_Cnn.CreateInstance( __uuidof(
ADODB::Connection ) );
m_Cnn->Open(CnnStr, UserName, Pwd, NULL);
}
CATCHERROR(m_Cnn,0)
sprintf(m_ErrStr,"Success");
return 1;
}
If the object needs to have a lifetime that exceeds the scope where it is created, and it
must be created only when it is realized it is needed, then, and ONLY then, would you
consider using 'new' to create it.
joe
****
==== [pointer version (reference)] ====
If I need to pass the object to another function then I can also use
(reference) -
Database db;
bool flag = openConnection ( db, "user", "pass" );
by doing method #1 and #3, i can avoid pointer most of the time?
****
There are objects, references to objects, and pointers to objects. It is important to
learn these fundamental concepts of C++ programming, Do not EVER assume that 'new' is
required when a pointer or reference to an object is required.
****
then I will not need to worry about delete / free pointer after using
it.
****
The less you need to worry about delete (and you are programming in C++ so 'free' is not
something you would seriously consider!) the better off you are. It is a common
programming error that when you see a prototype of some sort that wants a SOMETHING* that
you immediately think that you must have a VARIABLE of time SOMETHING* and you must use
'new' to create an object instance. The prototype clearly states it wants a POINTER to a
SOMETHING and all you have to do is provide a pointer! & works exceedingly well for this
purpose. But references are better if you are creating the function that is being called.
joe
****
Joseph M. Newcomer [MVP]
email: newcomer@flounder.com
Web: http://www.flounder.com
MVP Tips: http://www.flounder.com/mvp_tips.htm