這個簡短的程序應該顯示靜態成員變量在類中的行爲。
#include <vector>
#include <string>
#include <iostream>
#include <iomanip>
#include <map>
#include <fstream>
class Person {
protected:
// sbcp = static base class Person
static unsigned sbcPID_;
const unsigned myID_ { sbcPID_ };
std::string name_;
unsigned age_;
public:
Person() { ++sbcPID_; }
Person(const std::string& name, unsigned age) :
name_(name), age_(age) {
++sbcPID_;
}
static unsigned getBaseStaticID() { return sbcPID_; }
virtual unsigned getMyID() const { return this->myID_; }
std::string getName() const { return name_; }
unsigned getAge() const { return age_; }
virtual void getdata() { std::cout << "Person::getDataCalled\n"; /* code */ }
virtual void putdata() { std::cout << "Person::putDataCalled\n"; /* code */ }
};
class Student : public Person {
private:
// sdcS = static derived class Student
static unsigned sdcSID_;
const unsigned myID_ { sdcSID_ };
int marks[6] {};
int sum { 0 };
public:
Student() : Person() { ++sdcSID_; }
Student(const std::string& name, unsigned age) :
Person(name, age) {
++sdcSID_;
}
static unsigned getDerivedStaticID() { return sdcSID_; }
virtual unsigned getMyID() const override { return this->myID_; }
virtual void getData() { std::cout << "Student::getDataCalled\n"; /* code */ }
virtual void putData() { std::cout << "Student::putDataCalled\n"; /* code */ }
};
class Professor : public Person {
private:
// sdcP = static derived class Proffesor
static unsigned sdcPID_;
const unsigned myID_ { sdcPID_ };
int publications_;
public:
Professor() : Person() { ++sdcPID_; }
Professor(const std::string& name, unsigned age) :
Person(name, age) {
++sdcPID_;
}
static unsigned getDerivedStaticID() { return sdcPID_; }
virtual unsigned getMyID() const override { return this->myID_; }
virtual void getData() { std::cout << "Professor::getDataCalled\n"; /* code */ }
virtual void putData() { std::cout << "Professor::putDataCalled\n"; /* code */ }
};
unsigned Person::sbcPID_ = 0;
unsigned Student::sdcSID_ = 0;
unsigned Professor::sdcPID_ = 0;
int main() {
std::vector<Professor*> professors;
std::vector<Student*> students;
std::multimap<unsigned, Person*> allCampusMembers;
// Populate a staff of 5 professors;
std::vector<std::string> professorsNames { "D. Hall", "T. Roland", "S. McKinney", "A. Wesker", "J. Krispen" };
std::vector<unsigned> professorAges { 39, 58, 27, 69, 42 };
for (unsigned n = 0; n < 5; n++) {
professors.emplace_back(new Professor(professorsNames[n], professorAges[n]));
// Also add to our map
allCampusMembers.emplace(std::make_pair(professors[n]->getMyID(), dynamic_cast<Person*>(professors[n])));
}
// Do the Same for 10 students
std::vector<std::string> studentNames { "M. Asbury", "D. Brighton", "L. Caldwell", "R. Griscom", "B. Koloski",
"J. Martin", "V. Ottaman", "A. Peterson", "S. Richards", "A. Samuels" };
std::vector<unsigned> studentAges { 22, 21, 19, 20, 23,
26, 28, 32, 19, 21 };
for (unsigned n = 0; n < 10; n++) {
students.emplace_back(new Student(studentNames[n], studentAges[n]));
// Also add to our map
allCampusMembers.emplace(std::make_pair(students[n]->getMyID(), dynamic_cast<Person*>(students[n])));
}
// Also log to a text file:
std::fstream out("Log.txt", std::ios::out | std::ios::trunc);
// Use The Map To Go Through And Print Out The (Person ID), (Private ID), Name & Age.
std::multimap<unsigned, Person*>::iterator it = allCampusMembers.begin();
for (; it != allCampusMembers.end(); ++it) {
out << "BaseID: " << it->second->getBaseStaticID() << " "
<< "DerivedID: " << it->second->getMyID() << "\n"
<< "Name: " << it->second->getName() << " "
<< "Age: " << it->second->getAge() << "\n\n";
std::cout << "BaseID: " << it->second->getBaseStaticID() << " "
<< "DerivedID: " << it->second->getMyID() << "\n"
<< "Name: " << it->second->getName() << " "
<< "Age: " << it->second->getAge() << "\n\n";
}
std::cout << std::endl;
// Clear Out Our Memory
allCampusMembers.clear();
for (unsigned n = 0; n < professors.size(); n++) {
delete professors[n];
professors[n] = nullptr;
}
professors.clear();
for (unsigned n = 0; n < students.size(); n++) {
delete students[n];
students[n] = nullptr;
}
students.clear();
professorsNames.clear();
professorAges.clear();
studentNames.clear();
studentAges.clear();
std::cout << "\nPress any key and enter to quit." << std::endl;
char c;
std::cin >> c;
return 0;
}
如果按原樣運行此簡短程序;你應該得到這樣的輸出:
BaseID: 15 DerivedID: 0
Name: D. Hall Age: 39
BaseID: 15 DerivedID: 0
Name: M. Asbury Age: 22
BaseID: 15 DerivedID: 1
Name: T. Roland Age: 58
BaseID: 15 DerivedID: 1
Name: D. Brighton Age: 21
BaseID: 15 DerivedID: 2
Name: S. McKinney Age: 27
BaseID: 15 DerivedID: 2
Name: L. Caldwell Age: 19
BaseID: 15 DerivedID: 3
Name: A. Wesker Age: 69
BaseID: 15 DerivedID: 3
Name: R. Griscom Age: 20
BaseID: 15 DerivedID: 4
Name: J. Krispen Age: 42
BaseID: 15 DerivedID: 4
Name: B. Koloski Age: 23
BaseID: 15 DerivedID: 5
Name: J. Martin Age: 26
BaseID: 15 DerivedID: 6
Name: V. Ottaman Age: 28
BaseID: 15 DerivedID: 7
Name: A. Peterson Age: 32
BaseID: 15 DerivedID: 8
Name: S. Richards Age: 19
BaseID: 15 DerivedID: 9
Name: A. Samuels Age: 21
由於這會顯示該靜態成員變量使用更多作爲其中const
用於值唯一ID的引用計數。
你明白什麼'靜態'意味着一個類中的變量? –