Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 自动对象创建,如何控制/增加名称?_C++_Arrays_Pointers_Object_Constructor - Fatal编程技术网

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

C++ 自动对象创建,如何控制/增加名称?,c++,arrays,pointers,object,constructor,C++,Arrays,Pointers,Object,Constructor,我在使用用户输入变量创建对象时遇到了一些困难。基本上,程序确定用户想要什么类型的对象,创建它,然后询问用户是否想要添加另一个对象。在本例中,对象是经理,它是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 e

我在使用用户输入变量创建对象时遇到了一些困难。基本上,程序确定用户想要什么类型的对象,创建它,然后询问用户是否想要添加另一个对象。在本例中,对象是经理,它是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等。根据用户的需要,将有不同的编号,我希望以某种方式保留它们,以区分不同之处

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

对象名称是否需要不同

它们不需要不同,当您将它们存储在数组中时,对象和它们的名称之间没有任何连接,例如,它们都可以使用
manager1
1进行实例化。(此外,您不能使用其名称进行搜索。)

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

编辑1: 创建对象计数器的一种方法是定义数据成员:
静态整数计数器=0。然后在构造函数中递增
计数器
,以反映对象实例化,并在析构函数中递减

编辑2: 如果要存储对象,最好使用
向量容器\u name
(而不是数组)。为此,需要在要存储的对象外部定义一个向量。在存储指向type
object\u type
的指针的情况下,可以执行以下操作:

vector<object_type*> container_name;

object_type* ObjectInstance = new object_type(parameters);

// store in vector
container_name.emplace_back(ObjectInstance);
向量容器\u名称;
对象类型*ObjectInstance=新对象类型(参数);
//矢量存储
容器名称、安放位置、背面(ObjectInstance);


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

因为管理器对象可以是无穷多个,所以不能全部命名。C++是一种静态类型语言。严格来说,您需要将manager对象保持在类似数组的结构中:

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));
    }
}
但请注意,您需要删除apppriate位置中的manager对象指针以避免泄漏:

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

除非您遍历数组试图通过
name
查找
管理器
,否则没有什么真正关心它。每个对象中存储的值比名称多,恰好manager构造函数只需要一个。此时,
manager1
对象将在
add\u manager
函数的末尾被销毁,因为它是在堆栈上分配的,我猜这不是您想要的?也许你想在堆上动态分配?当整个程序结束时它应该被销毁,不是吗?我上面的代码只是相关部分的一个片段。我遗漏了其他所有内容,但在程序结束之前,会自动显示一组有关经理和其他员工的信息,此时我希望所有信息都被销毁。有人建议我在manager类中设置一个静态计数器以启用搜索,但我不确定如何实现这一点。至于要点,所以即使每个管理器对象都是用manager manager1创建的,因为创建的指针将指向它的特定管理器对象,这没有什么区别?还是我误解了?在程序的生命周期中,是否会在数组中保留指向它们的指针并执行相同的操作?我们还没有看到向量,我们需要在某个地方使用动态内存。我试图让这个向量系统工作,但我认为因为我把向量存储在另一个对象中,所以我做错了。如果你能看一看的话,我已经发了一篇关于更详细的帖子,因为你对我需要什么有更好的了解。
delete vManagers[n];
vManagers[n] = NULL;