电话薄程序的雏型
include<string>
#include<iomanip>
#include<cassert>
using namespace std;
class PhoneBookEntry
{
public:
typedef unsigned long PhoneNumber;
typedef char const* NameString;
PhoneBookEntry(NameString person, PhoneNumber telephone);
~PhoneBookEntry(void){}
//
//bit-wise copy is fine
//
//PhoneBookEntry(PhoneBookEntry const&);
//PhoneBookEntry operator=(PhoneBookEntry const&);
void SetName(NameString name);
NameString const GetName(void) const;
void SetPhoneNumber(PhoneNumber telephone);
PhoneNumber const GetPhoneNumber(void) const;
friend ostream& operator << ( ostream &out, PhoneBookEntry const &entry );
friend bool operator ==( PhoneBookEntry const& lhs, PhoneBookEntry const& rhs);
private:
static int const MAX_NAME_LEN = 60;
PhoneNumber mPhoneNumber;
char mPersonName[MAX_NAME_LEN];
};
PhoneBookEntry::PhoneBookEntry(NameString person, PhoneNumber telephone)
: mPhoneNumber(telephone)
{
strncpy(mPersonName, person, MAX_NAME_LEN);
}
void PhoneBookEntry::SetName(NameString name)
{
strncpy(mPersonName, name, MAX_NAME_LEN);
}
PhoneBookEntry::NameString const PhoneBookEntry::GetName(void) const
{
return mPersonName;
}
void PhoneBookEntry::SetPhoneNumber(PhoneNumber telephone)
{
mPhoneNumber = telephone;
}
PhoneBookEntry::PhoneNumber const PhoneBookEntry::GetPhoneNumber(void) const
{
return mPhoneNumber;
}
bool operator ==( PhoneBookEntry const& lhs, PhoneBookEntry const& rhs)
{
return ( 0 == strcmp(lhs.mPersonName,rhs.mPersonName)
&& lhs.mPhoneNumber == rhs.mPhoneNumber);
}
ostream & operator<<( ostream &out, PhoneBookEntry const& entry )
{
out << "姓名:" << entry.mPersonName << '/t'
<< "电话号码:" <<entry.mPhoneNumber;
return out;
}
template <class T>
class List
{
public:
List();
~List();
void Add(T const& );
//T * Namefind( char *name );
//T * Telfind( unsigned int tl );
//void PrintList();
protected:
struct Node
{
Node *next;
T value;
Node(Node* aNode, T aValue)
: next(aNode), value(aValue)
{
}
virtual ~Node(){}
};
Node *mFirst;
virtual Node* Create(Node* next, T aValue);
virtual void Delete(Node* node);
};
template <class T>
List<T>::List() : mFirst(0)
{
}
template <class T>
List<T>::~List()
{
Node * p = mFirst;
while( mFirst )
{
mFirst = mFirst->next;
Delete(p);
p = mFirst;
}
}
template <class T>
void List<T>::Add(T const& value)
{
mFirst = Create(mFirst, value);
}
template <class T>
typename List<T>::Node* List<T>::Create(Node* next, T aValue)
{
return new Node(next, aValue);
}
template <class T>
void List<T>::Delete(Node* node)
{
delete node;
}
class PhoneBook : public List<PhoneBookEntry *>
{
public:
typedef PhoneBookEntry::PhoneNumber PhoneNumber;
typedef PhoneBookEntry::NameString NameString;
PhoneBookEntry* const FindByName(NameString person) const;
PhoneBookEntry* const FindByPhoneNumber(PhoneNumber telephone) const;
friend ostream & operator<<( ostream &out, PhoneBook const& entry);
};
PhoneBookEntry* const PhoneBook::FindByName(NameString person) const
{
Node * p = mFirst;
while( p )
{
if( 0 == strcmp(person, p->value->GetName()))
{
return p->value;
}
p = p->next;
}
return 0;
}
PhoneBookEntry* const PhoneBook::FindByPhoneNumber(PhoneNumber telephone) const
{
Node * p = mFirst;
while( p )
{
if( telephone == p->value->GetPhoneNumber())
{
return p->value;
}
p = p->next;
}
return 0;
}
ostream & operator<<( ostream &out, PhoneBook const& entry)
{
PhoneBook::Node * p = entry.mFirst;
out <<"---PhoneBook Begin--" << endl;
while(p)
{
cout << *(p->value) <<endl;
p = p->next;
}
out <<"---PhoneBook end---" <<endl;
return out;
}
void test1()
{
cout<<endl<<"!!!!!!!test 1 !!!!!!!"<<endl;
PhoneBook aPhoneBook;
cout << aPhoneBook;
assert( 0 == aPhoneBook.FindByName("杨文"));
assert( 0 == aPhoneBook.FindByPhoneNumber(85424161));
}
void test2()
{
cout<<endl<<"!!!!!!!test 2 !!!!!!!"<<endl;
PhoneBook aPhoneBook;
PhoneBookEntry cc( "杨文", 85424161 );
aPhoneBook.Add(&cc);
cout << aPhoneBook;
assert( cc == *aPhoneBook.FindByName("杨文"));
assert( &cc == aPhoneBook.FindByName("杨文"));
cout << *aPhoneBook.FindByPhoneNumber(85424161)<<endl;
}
void test3()
{
cout<<endl<<"!!!!!!!test 3 !!!!!!!"<<endl;
PhoneBook aPhoneBook;
PhoneBookEntry a1 = PhoneBookEntry( "杨文", 85424161 );
PhoneBookEntry a2 = PhoneBookEntry( "张三", 85424161 );
PhoneBookEntry a3 = PhoneBookEntry( "李四", 85424161 );
aPhoneBook.Add(&a1);
aPhoneBook.Add(&a2);
aPhoneBook.Add(&a3);
cout << aPhoneBook;
assert( a3 == *aPhoneBook.FindByName("李四"));
assert( &a3 == aPhoneBook.FindByName("李四"));
cout << *aPhoneBook.FindByPhoneNumber(85424161)<<endl;
}
void main()
{
test1();
test2();
test3();
}
功能不完整.
posted on 2004-07-17 15:06 Anthony-黄亮 阅读(71) 评论(0) 编辑 收藏 举报