Click here to Skip to main content
15,892,005 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
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:
C++
// Address.h - Contains ADDRESS class
#ifndef ADDRESS_H
#define ADDRESS_H

ref class Address : public City
{
private:
	System::String^ street;
	System::Int32	address;
	System::Int32	zip;

public:
	// CONSTRUCTOR, No-arg
	Address()
	{
		stateID = StateCODE::missing;
		cityName = "missing";
		street = "missing";
		address = 0;
		zip = 0;
	}
	// CONSTRUCTOR
	Address(StateCODE sc, System::String^ cn, System::String^ st)
	{
		stateID = sc;
		cityName = cn;
		street = st;
	}
	// Copy CONSTRUCTOR ("const tracking reference" parameter p. 415)
	//Address( Address% a)
	Address(const Address% a)
	{
		stateID = a.stateID;
		//cityName = a.cityName;
		street = a.street;
		address = a.address;
		zip = a.zip;
	}		
};

#endif


This is my "State" class:
C++
// State.h - Contains STATE class
#ifndef STATE_H
#define STATE_H

// StateCODE are alphabetized according to their full name, not abbreviations.
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:
	// Default constructor
	State()	{	}

	// Function to return name of state as a String^.
	System::String^ name()
	{
		switch (safe_cast<int>(this->sCODE))								// sCODE is an enum.
		{
		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
Posted
Comments
[no name] 6-May-14 10:59am    
Please post the source for class "City". The Address constructor probably needs to call the City constructor.
Philippe Mori 13-May-14 18:33pm    
Usually a copy contructor should also call its base copy constructor and that one should copy its own fields.

1 solution

 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900