//File Name.h

class Name {

public:
	Name(const char * aNameOfThing){
		size_t length = strlen(aNameOfThing) + 1;
		nameOfThing = new char[length];
		strcpy_s(nameOfThing, length, aNameOfThing);

		lastName = NULL;
		firstName = NULL;
	}
	Name(const char * aFirstName, const char * aLastName){
		size_t length = strlen(aFirstName) + 1;
		firstName = new char[length];
		strcpy_s(firstName, length, aFirstName);

		length = strlen(aLastName) + 1;
		lastName = new char[length];
		strcpy_s(lastName, length, aLastName);

		nameOfThing = NULL;
	}
	Name(const Name & n){
		if(n.firstName != NULL){
			size_t length = strlen(n.firstName) + 1;
			firstName = new char[length];
			strcpy_s(firstName, length, n.firstName);
		}
		else
			firstName = NULL;

		if(n.lastName != NULL){
			size_t length = strlen(n.lastName) + 1;
			lastName = new char[length];
			strcpy_s(lastName, length, n.lastName);
		}
		else
			lastName = NULL;

		if(n.nameOfThing != NULL){
			size_t length = strlen(n.nameOfThing) + 1;
			nameOfThing = new char[length];
			strcpy_s(nameOfThing, length, n.nameOfThing);
		}
		else
			nameOfThing = NULL;
	}
	~Name(){
		if(firstName != NULL)
			delete [] firstName;
		if(lastName != NULL)
			delete [] lastName;
		if(nameOfThing != NULL)
			delete [] nameOfThing;
	}
	Name & operator=(const Name & n){
		if(n.firstName != NULL){
			size_t length = strlen(n.firstName) + 1;
			firstName = new char[length];
			strcpy_s(firstName, length, n.firstName);
		}
		else
			firstName = NULL;

		if(n.lastName != NULL){
			size_t length = strlen(n.lastName) + 1;
			lastName = new char[length];
			strcpy_s(lastName, length, n.lastName);
		}
		else
			lastName = NULL;

		if(n.nameOfThing != NULL){
			size_t length = strlen(n.nameOfThing) + 1;
			nameOfThing = new char[length];
			strcpy_s(nameOfThing, length, n.nameOfThing);
		}
		else
			nameOfThing  = NULL;
		return *this;
	}
	static void printLastNameFirst(bool lastNameFirstIfTrue){
		lastNameFirst = lastNameFirstIfTrue;
	}
	void printOn(ostream & o) const {
		if(nameOfThing != NULL)
			o << nameOfThing;
		else{
			if(lastNameFirst == true)
				o << lastName << ", " << firstName;
			else
				o << firstName << " " << lastName;
		}
	}

private:
     char * firstName;
     char * lastName;
     char * nameOfThing;
     static bool lastNameFirst;

};

bool Name::lastNameFirst= false; //initialize static variable

ostream & operator<<(ostream & ostr, const Name & n) {
     n.printOn(ostr);
     return ostr;
} 