2016-03-07 65 views
0

我是oop的初學者,這是我的學習項目。管理公司的模擬器。首先,我不確定我的想法是否正確。我想,我必須手動調用析構函數來保留合適數量的僱傭員工。如果我不這樣做,那麼萬一用戶不想使用生成的人,構造函數將會增加ID。所以如果有人有更好的想法來解決它,我願意提出建議。我的問題是,根據delete some_new_employee發生錯誤。我不明白這意味着什麼。我想問任何解釋。在手動調用析構函數期間發生錯誤:表達式必須是指向完整對象類型的指針

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

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

    Employee::~Employee() 
    { 
     --id; 
    } 

    int Number() 
    { 
     return id; 
    } 
}; 

int Employee::ID = 0; 

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; 
} 

bool are_u_sure() 
{ 
    std::string decision; 

    do 
    { 
     std::cout << "Are you sure [Y/N]?" << std::endl; 
     std::cin >> decision; 

     if (decision == "y" || decision == "Y") 
     { 
      return true; 
     } 
     else if (decision == "n" || decision == "N") 
     { 
      return false; 
     } 
     else 
     { 
      std::cout << "Unknow option. Try again." << std::endl; 
     } 
    } while (true); 
} 

int main() 
{ 
    std::vector<Employee> employees; 
    std::string option; 

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

    do 
    { 
     std::cout << "Type .hire to hire a new employee" << std::endl; 
     std::cin >> option; 

     if(option == ".hire") 
     { 
      Employee some_new_employee; 
      some_new_employee = generate_random_employee(some_new_employee); 

      std::cout << "So... do you want to hire a new employee? Let's look at CVs " << std::endl; 
      std::cout << "I've got one. What do u think about " << some_new_employee.name << " age " << some_new_employee.age << "?" << std::endl; 

      if (are_u_sure()) 
      { 
       employees.push_back(some_new_employee); 
      } 
      else 
      { 
       delete some_new_employee; 
      } 
     } 
    } while (option != ".end"); 
} 
+1

您對分配了'new'的對象調用'delete'。 – PaulMcKenzie

+0

嗯......問題是:我應該如何恰當地銷燬'Employee some_new_employee'創建的對象? – mathsicist

+1

退出模塊時會自動銷燬。你不需要手動調用析構函數。 – PaulMcKenzie

回答

2

您只能撥打delete分配給new的對象。

這些行:

Employee some_new_employee; 
some_new_employee = generate_random_employee(some_new_employee); 

不使用任何指針(這是什麼delete要求),並且不分配使用new(這是使用所需的delete第二件事)。

some_new_employee是一個自動變量,當它聲明的塊被退出時它將自動被銷燬。換句話說,在這裏:

if(option == ".hire") 
{ 
    Employee some_new_employee; 
    some_new_employee = generate_random_employee(some_new_employee); 
    // code 
    //... 
} // <-- some_new_employee gets destroyed here, automatically 

如果你爲什麼覺得有必要摧毀它是因爲std::vector在你的代碼塊中使用的原因,vector副本你在其中放置物體的。因此,some_new_employee被銷燬是安全的,因爲載體已經存儲了它的副本。

+0

我不確定我是否正確理解你。你是否想說,如果我們將不帶'push_back()'對象的'if'塊留下,那麼這個對象會自己被銷燬? – mathsicist

+0

是的。這是C++的基礎。如果一個自動變量離開作用域,它會自動銷燬。 – PaulMcKenzie

+0

好的,我明白了。謝謝你一個很好的解釋 – mathsicist

1

我認爲'刪除some_new_employee'是不必要的。
因爲'刪除'是針對對象的指針。

if(option == ".hire") 
{ 
    Employee* temp_some_new_employee = new Employee(); 
    Employee some_new_employee = generate_random_employee(*temp_some_new_employee); 

// ==========something========= 

    if (are_u_sure()) 
    { 
     employees.push_back(some_new_employee); 
    } 
    // In the case of way of this writing, this is necessary. 
    // And some_new_employee will be deleted when it will be out of scope 
    delete temp_some_new_employee; 
} 

在靜態對象的情況下,它被自動刪除。

+0

好吧,我現在看到了不同。 – mathsicist

相關問題