デストラクタを手動で呼び出すと、エラーが発生します。式は完全なオブジェクトタイプへのポインタである必要があります

数学者

私はおっとの初心者で、これが私の学習プロジェクトです。会社経営のシミュレーター。まず、私の考えが正しいかどうかわかりません。適切な数の雇用された従業員を維持するために、手動でデストラクタに電話する必要があると思います。私がそれをしない場合、ユーザーが生成された男を採用したくない場合は、コンストラクターは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");
}
PaulMcKenzie

delete割り当てられたオブジェクトのみを呼び出す必要がありますnew

これらの行:

Employee some_new_employee;
some_new_employee = generate_random_employee(some_new_employee);

ポインタ(delete必要なもの)を使用せず、new使用するためdelete必要な2番目のもの)を使用して割り当てません

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、ベクターにはすでにそのコピーが保存されているため、破棄ても安全です

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ