//DebugStuff.h #pragma once #ifdef _DEBUG #define CONSTRCTOR_TRACE #define FUNCTION_TRACE #endif //Name.h #pragma once class Name { public: Name(); Name(const char *pfirst,const char* psecond); char *getName(char *pName) const; size_t getNameLength()const; bool operator<(const Name& name)const; bool operator==(const Name& name)const; bool operator>(const Name& name)const; virtual ~Name(); private: char *pFirstname; char *pSurname; }; //Name.cpp #include "Name.h" #include "Debugstuff.h" #include <cassert> #include <iostream> #include <cstring> #include <string> using namespace std; Name::Name() { #ifdef CONSTRUCTOR_TRACE //Trace constructor calls cerr<<"/nDefault Name constructor called"; #endif pFirstname=pSurname='/0'; } //construct Name::Name(const char* pFirst,const char *pSecond) { //Veriry that arguments are not null assert(pFirst!=0); assert(pSecond!=0); #ifdef CONSTRUCTOR_TRACE //Trace construct calls cout<<"/nName constructor called"; #endif pFirstname=new char[strlen(pFirst)+1]; strcpy(pFirstname,pFirst); pSurname=new char[strlen(pSecond)+1]; strcpy(pSurname,pSecond); } //progamme char* Name::getName(char *pName) const { assert(pName !=0); #ifdef FUNCTION_TRACE //Trace function calls cout<<"/nName:getName() callded"; #endif strcpy(pName,pFirstname); //pName[strlen(pName)]='@'; strcat(pName+strlen(pName),"@"); //append second name and return total strcat(pName+strlen(pName),pSurname); return pName; } //return a total length of a name size_t Name::getNameLength()const { #ifdef FUNCTION_TRACE //Trace function calls cout<<"/n Name::getlength() called"; #endif return strlen(pFirstname)+strlen(pSurname)+2; } Name::~Name() { } #include <iostream> #include "Name.h" using namespace std; int main() { Name myName("ivor","horton"); char theName[12]=""; cout<<"/n The name is "<<myName.getName(theName); char *pName= new char[myName.getNameLength()]; cout<<"/nThe name is"<<myName.getName(pName); cout<<endl; return 0; }