I'm a "returning" student and a noob to this forum. Having big trouble with chap on CLI classes (Horton C++ 2010 chap 8).
My practice project currently contains Address objects that have city name, street name, street number, and zip.
All works well until I try to implement a copy constructor. The book says to create a copy constructor for CLI must pass argument as "const tracking reference" (it actually says 'const reference' but the example uses %).
This is my "Address" class:
#ifndef ADDRESS_H
#define ADDRESS_H
ref class Address : public City
{
private:
System::String^ street;
System::Int32 address;
System::Int32 zip;
public:
Address()
{
stateID = StateCODE::missing;
cityName = "missing";
street = "missing";
address = 0;
zip = 0;
}
Address(StateCODE sc, System::String^ cn, System::String^ st)
{
stateID = sc;
cityName = cn;
street = st;
}
Address(const Address% a)
{
stateID = a.stateID;
street = a.street;
address = a.address;
zip = a.zip;
}
};
#endif
This is my "State" class:
#ifndef STATE_H
#define STATE_H
public enum class StateCODE
{
missing,
AL, AK, AZ, AR, CA, CO, CT, DE, DC, FL, GA, HI, ID, IL, IN, IA, KS,
KY, LA, ME, MD, MA, MI, MN, MS, MO, MT, NE, NV, NH, NJ, NM, NY, NC,
ND, OH, OK, OR, PA, RI, SC, SD, TN, TX, UT, VT, VA, WA, WV, WI, WY
};
ref class State
{
private:
StateCODE sCODE;
public:
State() { }
System::String^ name()
{
switch (safe_cast<int>(this->sCODE)) {
case 0: return "missing"; break;
case 1: return "Alabama"; break;
case 2: return "Alaska"; break;
case 3: return "Arizona"; break;
case 4: return "Arkansas"; break;
case 5: return "California"; break;
case 6: return "Colorado"; break;
case 7: return "Connecticut"; break;
case 8: return "Delaware"; break;
case 9: return "District of Columbia"; break;
case 10: return "Florida"; break;
case 11: return "Georgia"; break;
case 12: return "Hawaii"; break;
case 13: return "Idaho"; break;
case 14: return "Illinois"; break;
case 15: return "Indiana"; break;
case 16: return "Iowa"; break;
case 17: return "Kansas"; break;
case 18: return "Kentucky"; break;
case 19: return "Louisiana"; break;
case 20: return "Maine"; break;
case 21: return "Maryland"; break;
case 22: return "Massachusetts"; break;
case 23: return "Michigan"; break;
case 24: return "Minnesota"; break;
case 25: return "Mississippi"; break;
case 26: return "Missouri"; break;
case 27: return "Montana"; break;
case 28: return "Nebraska"; break;
case 29: return "Nevada"; break;
case 30: return "New Hampshire"; break;
case 31: return "New Jersey"; break;
case 32: return "New Mexico"; break;
case 33: return "New York"; break;
case 34: return "North Carolina"; break;
case 35: return "North Dakota"; break;
case 36: return "Ohio"; break;
case 37: return "Oklahoma"; break;
case 38: return "Oregon"; break;
case 39: return "Pennsylvania"; break;
case 40: return "Rhode Island"; break;
case 41: return "South Carolina"; break;
case 42: return "South Dakota"; break;
case 43: return "Tennessee"; break;
case 44: return "Texas"; break;
case 45: return "Utah"; break;
case 46: return "Vermont"; break;
case 47: return "Virginia"; break;
case 48: return "Washington"; break;
case 49: return "West Virginia"; break;
case 50: return "Wisconsin"; break;
case 51: return "Wyoming"; break;
default: return "";
}
}
property StateCODE stateID
{
StateCODE get(){ return sCODE; }
void set(StateCODE value){ sCODE = value; }
}
};
#endif
The stateID = a.stateID; line of the 'Address' class COPY CONSTRUCTOR causes the trouble, as does the "cityName = a.cityName" which I've commented out. When I compile this I get:
error C2662: 'StateCODE State::stateID::get(void)' : cannot convert 'this' pointer from 'const Address' to 'State %' Conversion loses qualifiers
If I remove "const" qualifier from copy constructor it works. If I try to make 'State' property and it's get accessor const it complains about the set accessor. If I also make the set accessor const, then the copy constructor doesn't work.
What's going on and what can I do?
Thanks in advance for your help