2016-03-02 4 views
-2

Я видел много вопросов и ответов об этой проблеме, но все же я не могу решить свою проблему. Как инициализировать статический вектор? Я также прошу вас проверить, что я правильно использую конструкцию по умолчанию. Я не хочу проверить, работает ли он, потому что я знаю, что это так. Мне просто интересно, это элегантная реализация?Статический вектор как контейнер объектов класса

class Employee 
{ 
private: 
    static std::vector<Employee> employee; 
    std::string name; 
    int age; 

    Employee::Employee() 
    { 
     std::string localName; 
     int localAge; 

     std::cout << "So... do you want to hire a new employee? Let's look at CVs " << std::endl; 
     localName = "Marek"; //GenerateName(); 
     localAge = 21; //these function is not ready yet. it'd be just a rand() 
     std::cout << "I've got one. What do u think about " << localName << " age " << localAge << "?" << std::endl; 

     int decision; 

     do 
     { 
      std::cout << "Do you want hire him [1] or not [2] ? " << std::endl; 
      std::cin >> decision; 

      switch (decision) 
      { 
      case 1: 
       name = localName; 
       age = localAge; 
       decision = 0; 
       break; 

      case 2: 
       employees.erase(employees.end()); 
       decision = 0; 
       break; 

      default: 
       std::cout << "Incorrect option. Try again" << std::endl; 
      } 
     } while (decision != 0); 
    } 

public: 
    static void Employ() 
    { 
     employees.push_back(Employee::Employee()); 
    } 
}; 

int main() 
{ 
    Employee::Employ(); 

    system("pause"); 
} 
+2

_ «Я видел много вопросов и ответов по этому вопросу, но все же я не могу решить свою проблему». Не могли бы вы сначала рассказать нам, что обо всех этих ответах было бесполезно? Кажется бессмысленным повторять общие ответы еще раз, если есть что-то конкретное, которое отличается для вашего варианта использования. Для чего это стоит, я не понимаю, что это будет. Кроме того, я действительно не вижу _why_ вы используете здесь элемент 'static'. Почему бы не создать класс 'EmployeesCollection', который вы можете создать в' main'? –

+0

Прошу прощения? Я не понимаю, что вы подразумеваете под классом «EmployeesCollection». Я попытался создать «static void InstantiateVector();», но я не понял его полностью. Я также нашел кое-что о библиотеке ** boost **, но я решил решить проблему с помощью инструментов стандартов. – mathsicist

+0

. Я спрашиваю вас, почему вы думаете, что вам нужен член 'static', и если вы действительно это делаете, почему все многие ответы, которые вы уже прочитали, не помогли вам. Не нужно «просить прощения», спасибо. –

ответ

2

Ваш код не работает, когда я его запускал. В дополнение к добавлению включает и исправление некоторых опечаток, мне пришлось добавить эту строку:

std::vector<Employee> Employee::employee; 

Однако, я не думаю, что это самое лучшее решение. Для сладостной ясности, Сотрудник не должен содержать вектор Рабочих, но должен быть, ну, сотрудник. Если вам нужен вектор сотрудников, вы можете объявить его в основном (или в другом месте). Если вы хотите, чтобы ваш вектор сотрудников, чтобы иметь некоторые дополнительные функции, такие как функции интерактивных сотрудника добавляющих вы написали, вы можете сделать это следующим образом:

class EmployeeForce: public std::vector<Employee> 
{ 
    void interactivelyAddEmployee(); 
    ... 
}; 

... 
EmployeeForce myStaff; 
+0

Спасибо за ваш ответ. Я написал на другом форуме, и у меня есть тот же ответ, что и вы. Посмотрите, как выглядит мой код. Буду признателен, если вы просмотрите его для меня. Правильно ли я делаю это сейчас? – mathsicist

+0

Я не вижу никаких изменений в вашем коде. ? –

+0

Посмотрите, пожалуйста, – mathsicist

0

Я изменил всю концепцию. Проблема заключалась в том, что я не хотел помещать внутри класса контейнер объектов (в данном случае: std :: vector). Теперь я знаю, что класс должен содержать только информацию об одном объекте; он ничего не должен знать о других.

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

}; 

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

    return out; 
} 

Employee generate_random_employee(Employee obj) 
{ 
    obj.name = "Marek"; //GenerateName(); 
    obj.age = 21; //these function is not ready yet. it'd be just a rand() 

    return obj; 
} 

int main() 
{ 
    int decision; 
    std::string name; 
    std::vector<Employee> employees; 
    Employee some_new_employee; 

    std::cout << "Welcome mrs. manager. What do you want to do today, sir?" << std::endl << std::endl; 

    do 
    { 
     std::cout << "Hire sombody [1], Fire somebody [2], Exit [0] " << std::endl; 
     std::cin >> decision; 

     switch (decision) 
     { 
     case 1: 
      some_new_employee = generate_random_employee(some_new_employee); 

      if (should_i_employ(some_new_employee)) 
      { 
       employees.push_back(some_new_employee); 
      } 
      break; 

     case 2: 
      std::cout << "Who do you want to fire?" << std::endl; 
      std::cin >> name; 

      if (is_the_employee_exist(employees, name)) 
      { 
       if (are_u_sure()) 
       { 

       } 
      } 
      else 
       std::cout << "" << std::endl; 

      break; 

     case 3: 
      std::cout << employees << std::endl; 
      break; 

     case 0: 
      std::cout << "Good bye, sir" << std::endl; 
      break; 

     default: 
      std::cout << "There is not these option. Try again " << std::endl; 
     } 

    } while (decision != 0); 

    system("pause"); 
} 
+1

Хотя это может ответить на вопрос (ваш собственный), это только код без каких-либо объяснений. Ответ * * * должен указывать, что было сделано для устранения проблемы. – crashmstr

+0

хорошо ... Я запомню об этом. Я отредактирую его – mathsicist

Смежные вопросы