自动对象创建,如何控制/增加名称?

时间:2015-10-24 06:51:19

标签: c++ arrays pointers object constructor

我使用变量的用户输入创建对象时遇到了一些障碍。基本上,程序确定用户想要什么类型的对象,创建它,然后询问用户是否想要添加另一个对象。在此示例中,对象是一个manager,它是employee的子类。

void add_manager()
{
    string name;
    //Performs a bunch of checks to ensure the input is valid.
    name = get_string_input("Please input the name of the employee.");
    //Creates a manager object.
    manager manager1(name);
    //Goes back to previous function, restarts process of finding out employee type.
    ask_employee();
}

我将在其他地方存储动态数组中每个对象的指针。数组的目的只是从每个对象中获取值以用于某些打印输出,因此我希望只是遍历数组,获取每个对象的值,然后打印。 (粗略的例子)

我不确定的部分是如何更改对象构造函数调用,以便将对象设置为manager1,manager2等。由于用户想要的内容,将会有不同的编号,我希望保留他们以某种方式来区分它们。

由于我将通过指针访问对象,对象名称是否需要不同?或者对象和指针都可以具有相同的名称?

2 个答案:

答案 0 :(得分:2)

由于经理对象可以是无限数,因此您无法将它们全部命名。 C ++是一种静态类型语言。您需要将管理器对象保持在类似数组的结构中:

std::vector<manager *> vManagers;

void add_manager()
{
    string name;
    //Performs a bunch of checks to ensure the input is valid.
    name = get_string_input("Please input the name of the employee.");
    //Creates a manager object.
    vManagers.push_back(new manager(name));
    //Goes back to previous function, restarts process of finding out employee type.
    while(ask_employee()
    {
        name = get_string_input("Please input the name of the employee.");
        vManagers.push_back(new manager(name));
    }
}

因此,当您需要经理对象时,您可以致电:

 vManagers[n]->GetData();

但请注意,您需要在apppriate位置删除管理器对象指针以避免泄漏:

delete vManagers[n];
vManagers[n] = NULL;

答案 1 :(得分:1)

  

对象名称是否需要不同?

他们不需要与众不同,当您将它们存储在数组中时,对象与其名称之间没有任何联系,例如:它们可以使用manager1 1 进行实例化。 (此外,您无法使用其名称进行搜索。)

对象的区别在于其数据成员的值。因此,如果要搜索对象,请将对象idname定义为数据成员,然后您可以在搜索条件中使用它来查找特定的manager

编辑1:

创建对象计数器的一种方法是定义数据成员: static int counter = 0;。然后在构造函数中递增counter以反映对象实例化并在析构函数中递减它。

编辑2:

如果要存储对象,最好使用vector<object_type> container_name(而不是数组)。要执行此操作,您需要在要存储的对象外部定义矢量。如果存储指向object_type类型的指针,您可以执行以下操作:

vector<object_type*> container_name;

object_type* ObjectInstance = new object_type(parameters);

// store in vector
container_name.emplace_back(ObjectInstance);

1.只有在编译时,当您将源代码转换为可执行文件时,程序才能使用您提供变量的名称。之后,当您想要创建对象时,这些类型的信息将不再可用。程序只知道机器指令操作数所在的机器地址。