make -k main && cat main.cpp && ./main
g++ main.cpp -o main
/* #ident "$Id: main.cpp$"
* @author: rzr@gna.org - rev: $Author: rzr$
* Copyright: See README file that comes with this distribution
*****************************************************************************/
#include
#include
#include
#include
#include
#define LOG() \
std::cout \
<< __FILE__ << ":" << __LINE__ << ": log: " << __PRETTY_FUNCTION__ << std::endl
class Main
{
public:
Main() {
LOG();
ptr_ = new char[1];
}
virtual ~Main() {
LOG();
delete( ptr_);
}
public:
inline char * getPtr() const {
LOG();
return(getPtrNew());
}
///TODO: express: char const * const getPtr() const
inline char const * const getPtr(bool isconst/*=true*/) const {
LOG();
assert(isconst == true);
return( getPtrConst() );
}
public: //or private as you want
char * getPtrNew() const {
LOG();
return(strdup(ptr_));
}
char const * const getPtrConst() const
{
LOG();
return(ptr_);
}
private:
char * ptr_;
};
int main()
{
Main const main;
{
LOG();
char* pnew = main.getPtr();
delete(pnew);
}
{
LOG();
Main const main;
char const * const pconst = main.getPtr(true);
// no need to delete , main's destructor will do
}
{
LOG();
char const */* const*/ pconst = main.getPtr(true);
pconst = 0; // TODO: should be avoid if prev line use const..
LOG();
char const * const pnew = main.getPtr(); // TODO: delete const ?
delete(pnew);
}
return 0;
}
/*
make -k main && cat main.cpp && ./main
*/
//#eof "$Id:$"
main.cpp:21: log: Main::Main()
main.cpp:67: log: int main()
main.cpp:33: log: char* Main::getPtr() const
main.cpp:47: log: char* Main::getPtrNew() const
main.cpp:72: log: int main()
main.cpp:21: log: Main::Main()
main.cpp:39: log: const char* const Main::getPtr(bool) const
main.cpp:53: log: const char* const Main::getPtrConst() const
main.cpp:26: log: virtual Main::~Main()
main.cpp:78: log: int main()
main.cpp:39: log: const char* const Main::getPtr(bool) const
main.cpp:53: log: const char* const Main::getPtrConst() const
main.cpp:81: log: int main()
main.cpp:33: log: char* Main::getPtr() const
main.cpp:47: log: char* Main::getPtrNew() const
main.cpp:26: log: virtual Main::~Main()
One track to avoid the cast :
template
T getPtr() {
return (0);
}
==== MISC ====
http://en.wikipedia.org/wiki/Const-correctness#Loopholes_to_const-correctness
error: assignment of read-only reference