class Name { public: Name(void) { myName = 0; } ~Name(void) { delete[] myName; } void SetName(char* n) { myName = new char[strlen(n)+1]; strcpy(myName, n); } void Print(void) { cout << myName << endl; } private: char* myName; }; class Contact: public Name { public: Contact(void) { myAddress = 0; } ~Contact(void) { delete[] myAddress; } void SetAddress(char* c) { myAddress = new char[strlen(c)+1]; strcpy(myAddress,c); } void Print(void) { Name::Print(); cout << myAddress << endl; } private: char* myAddress; }; int main(void) { Contact c; c.SetName("Kath Day-Night"); c.SetAddress("137 Lakeside Drive"); c.Print(); }
Suggestion: Don't take my word for it! How could you write a set of classes that demonstrate this sequence of calls? Write a simple program to put the lecture notes to the test. |
class Stack : private List
{
public:
void Push(int i)
{ First(); Insert(i); }
int Pop(void)
{
First();
int top = GetCurrent();
DeleteCurrent();
return top;
}
};
int main(void)
{
Stack s;
s.Push(1)
s.Push(2);
cout << s.Pop() << endl;
s.Next(); // ERROR: List::Next() PRIVATELY INHERITED!
}
class Setter
{
public:
void Set(char*& variable, char* value)
{
variable = new char[strlen(value)+1];
strcpy(variable,value);
}
};
class Name: private Setter
{
public:
Name(void) { myName = 0; }
~Name(void) { delete[] myName; }
void SetName(char* n)
{ Set(myName,n); }
void Print(void)
{ cout << myName << endl; }
private:
char* myName;
};
class Contact: public Name
{
public:
Contact(void) { myAddress = 0; }
~Contact(void) { delete[] myAddress; }
void SetAddress(char* c)
{ Set(myAddress,c); } // ERROR! WHY?
void Print(void)
{
Name::Print();
cout << myAddress << endl;
}
private:
char* myAddress;
};
int main(void)
{
Contact c;
c.SetName("John McClane");
c.SetAddress("137th floor, Nakatome Towers");
c.Print();
}
class Coefficient
{
public:
Coefficient(void)
{ myValue = 0; myAccesses = 0; }
double GetValue(void) const
{ myAccesses++; return myValue; }
bool SetValue(double v)
{
myAccesses++;
if (v<0 || v>1) { return false; }
myValue = v;
return true;
}
private:
double myValue;
mutable int myAccesses;
};
enum Status { good, bad, ugly };
class StatusCoefficient : public Coefficient
{
public:
StatusCoefficient(void)
{ myStatus = ugly; }
Status GetStatus(void) const
{
myAccesses++; // ACCESS ERROR!
return myStatus;
}
bool SetStatus(Status s)
{
myAccesses++; // ACCESS ERROR!
myStatus = s;
return true;
}
private:
int myStatus;
};
class Coefficient
{
public:
Coefficient(void)
{ myValue = 0; myAccesses = 0; }
double GetValue(void) const
{ myAccesses++; return myValue; }
bool SetValue(double v)
{
myAccesses++;
if (v<0 || v>1) { return false; }
myValue = v;
return true;
}
private:
double myValue;
protected:
mutable int myAccesses;
};
enum Status { good, bad, ugly };
class StatusCoefficient : public Coefficient
{
public:
StatusCoefficient(void)
{ myStatus = ugly; }
Status GetStatus(void) const
{
myAccesses++; // ACCESS OKAY!
return myStatus;
}
bool SetStatus(Status s)
{
myAccesses++; // ACCESS OKAY!
myStatus = s;
return true;
}
private:
int myStatus;
};
class Coefficient
{
public:
Coefficient(void)
{ myValue = 0; myAccesses = 0; }
Coefficient(double initval)
{ myValue = initval; myAccesses = 0; }
// ETC. AS BEFORE...
};
class StatusCoefficient : public Coefficient
{
public:
StatusCoefficient(void)
{ myStatus = ugly; }
StatusCoefficient(double initval, Status initStatus)
: Coefficient(initval)
{ myStatus = initStatus; }
// ETC. AS BEFORE...
};
class Coefficient
{
public:
Coefficient(void)
: myValue(0), myAccesses(0)
{}
Coefficient(double initval)
{ myValue = initval; myAccesses = 0; }
// ETC. AS BEFORE...
};
class StatusCoefficient : public Coefficient
{
public:
StatusCoefficient(void)
: myStatus(ugly)
{}
StatusCoefficient(double initval, Status initStatus)
: Coefficient(initval), myStatus(initStatus)
{}
// ETC. AS BEFORE...
};