I am having difficulty writing my code in the way it should be written. This is my default constructor:
Address::Address() : m_city(NULL), m_street(NULL), m_buildingNumber(0), m_apartmentNumber(0)
{}
…and this is my other constructor:
Address::Address(const char* city, const char* street, const int buildingNumber,const int apartmentNumber) : m_city(NULL), m_street(NULL)
{
SetAddress(city,street,buildingNumber,apartmentNumber);
}
I have to initialize my city and street fields as they contain char * and my setter uses remove to set a new city for example. I would very much like to hear your opinion on how to write it in the right way without repeating code.
this is my SetAddress code :
bool Address::SetAddress(const char* city, const char* street, const int buildingNumber, const int apartmentNumber)
{
if (SetCity(city) == false || SetStreet(street) == false || SetBuildingNumber(buildingNumber) == false || SetApartmentNumber(apartmentNumber) == false)
return false;
return true;
}
and this is my SetCity:
bool Address::SetCity(const char* city)
{
if(city == NULL)
return false;
delete[] m_city;
m_city = new char[strlen(city)+1];
strcpy(m_city, city);
return true;
}
1 more question if i do change char* to string how can i check if string city doesnt equal to NULL as i know string does not have the “==” operator and string is an object and cannot be equal to null,
how can i check if the string i get is indeed legeal.
You can combine the two ctors:
[The top-level const on
buildingNumberandapartmentNumberaccomplished nothing and attempt to move implementation information into the interface, so I remove them.]Of, if you really prefer:
I generally prefer the former, but if
SetAddressqualifies its inputs, it may be worthwhile. Of course, the suggestion to usestd::stringinstead of pointers to char is a good one as well, but that’s a more or less separate subject.One other minor note: this does differ in one fundamental way from your original code. Your code required either 0 or 4 arguments to the ctor. This will accept anywhere from 0 to 4, arguments so a person could specify (for example) a city and street, but not a building number or apartment number. If it’s really important to you that attempts at using 1, 2 or 3 arguments be rejected, this approach won’t be useful to you. In this case, the extra flexibility looks like an improvement to me though — for example, if somebody lives in a single-family dwelling, it’s quite reasonable to omit an apartment number.