2016-03-06 2 views
0

Я начинаю в объектно-ориентированном программировании. В качестве учебного проекта я решил создать небольшую программу для управления компанией. Как подсчитать созданные объекты? Я читал об этом, но я этого не понимаю. Я хотел бы запросить показать мне, как я должен делать это, используя в качестве примера мой код:Как автоматически присваивать идентификатор объектам класса в C++

class Employee 
{ 
public: 
    std::string name; 
    int age; 
    static int id; 

    Employee::Employee() 
    { 
     id++; 
    } 
}; 

int Employee::id = 0; 

std::ostream& operator<<(std::ostream& out, const std::vector<Employee>& v) 
{ 
    out << "["; 
    for (size_t i = 0; i < v.size(); ++i) 
    { 
     out << "ID: " << v[i].id << " Name: " << v[i].name << " age: " << v[i].age; 
     if (i != v.size() - 1) 
      out << ", "; 
    } 
    out << "]"; 

    return out; 
} 

Employee generate_random_employee(Employee obj) 
{ 
    std::vector<std::string> male_names = {"Donald", "Piotr", "James", "Tiny", "Ricky"}; 
    std::vector<std::string> female_names = {"Diana", "Joelle", "Sue", "Karolina"}; 
    std::vector<std::string> lastnames = {"Lester", "Pound", "Park", "Ennis", "Duck", 
             "Tusk", "Disney", "Jurassic", "Looney-Warde" }; 

    int sex = (rand() % 2) + 0; 

    if (sex == 1) 
    { 
     obj.name = male_names[(rand() % (male_names.size() - 1)) + 0]; 
    } 
    else 
    { 
     obj.name = female_names[(rand() % (female_names.size() - 1)) + 0]; 
    } 

    obj.name += " " + lastnames[(rand() % (lastnames.size() - 1)) + 0]; 
    obj.age = (rand() % 24) + 25; 

    return obj; 
} 

int main() 
{ 
    srand(time(NULL)); 

    std::vector<Employee> employees; 
    Employee some_new_employee; 

    for(int i = 0; i < 2; i++) 
    { 
     some_new_employee = generate_random_employee(some_new_employee); //randomly generate a new employee. It is Employee type function 
     employees.push_back(some_new_employee); 
    } 

    std::cout << employees << std::endl; 
} 

в данный момент программа постоянно приписывать 1 в качестве идентификатора для всех объектов

+0

ваш код не компилируется ... отсутствует функция "generate_random_employee()" –

+0

Я хочу показать вид программы. Я не понимал, что вам нужна эта функция, чтобы помочь мне. Я добавил. Извините – mathsicist

+0

Спасибо ... ваша функция вполне разумная. Оказывается, этот вопрос допускает, что сотрудники не являются случайными, поэтому мое решение ниже игнорирует все, кроме идентификатора. –

ответ

1

Чтобы получить уникальный идентификатор для каждого сотрудника попробовать:

class Employee 
{ 
public: 
    std::string name; 
    int age; 
    int id; 

    static int ID; 

    Employee() 
     { 
     id = ID++; 
     } 
}; 

int Employee::ID = 0; 

std::ostream& operator<<(std::ostream& out, const std::vector<Employee>& v) 
{ 
    // ... 
    return out; 
} 

Main (упрощенный)

std::vector<Employee> employees; 

    for(int i = 0; i < 4; i++) 
    { 
     Employee e; 
     employees.push_back(e); 
    } 

    std::cout << employees << std::endl; 

выход:

[ID: 0 Name: age: 0, ID: 1 Name: age: 0, ID: 2 Name: age: 0, ID: 3 Name: age: 0] 

Ключевая идея: каждый экземпляр объекта требует уникального идентификатора. Статичность - это как раз противоположное ... общее значение для всех экземпляров.

ctor устанавливает свой собственный идентификатор И увеличивает статический идентификатор.

Обратите внимание, что идентификатор представляет, сколько из них было выполнено, но не сколько из них могло бы существовать (рассмотрите деструкторы, темпы, копии и т. Д.).

+0

У меня есть это, но код все еще не работает должным образом. Я скомпилировал ваш, и он тоже не работает. Для всех объектов атрибут 0 равен ID. – mathsicist

+0

мои извинения ... Я буду перерезать-вставить. –

+0

ОК, мой плохой. Я не помещал конструктор 'Employee e' внутри цикла. Спасибо – mathsicist

1

generate_random_employee(some_new_employee); employees.push_back(some_new_employee);

Ни одна из этих линий не вызывает конструктор.

Вы должны перегрузить оператор присваивания или конструктор копирования, чтобы увеличить счетчик.

И вы не можете иметь статический идентификатор ... Static означает, что все экземпляры будут иметь один и тот же идентификатор ...

Вы хотите SATIC счетчик и использовать его, чтобы присвоить идентификатор на строительство.

+0

спасибо, ваш ответ помогает мне понять проблему – mathsicist