如何在 C++ 中创建一个类的多个实例

Posted

技术标签:

【中文标题】如何在 C++ 中创建一个类的多个实例【英文标题】:How to make multiple instances of a class in C++ 【发布时间】:2014-10-11 00:47:09 【问题描述】:

如何在不单独输入名称的情况下创建多个类实例?

int main()
    myClass myInstance_1;
    myClass myInstance_2;
    myClass myInstance_3;
    ...
    myClass myInstace_10;

【问题讨论】:

取出循环体的myClass myInstance[i]; out,在for循环上方将其声明为myClass myInstance[10]; 如果您正在寻找一种将不同值传递给为每个成员构建一个数组,您不会像这样轻松地做到这一点(实际上可能是您要解决的真正的问题)。 你编译时是否带有完整的警告?使用-Wall -Wextra -pedantic 并且选择最新的C++ 标准的选项也不会错。然后编译器应该大声抱怨你的代码。 IMO 和所有尊重:你真的需要阅读一本好的 C++ 书。 为什么这个问题被否决了? 提供更完整的答案here。 【参考方案1】:

您可以执行以下操作:

int main()
    std::vector<myClass> myInstances;
    for(int i = 0; i < 10; ++i) 
        myInstances.emplace_back(i);
    
    myInstances[5].myClassFunction();

【讨论】:

如果你坚持使用标准容器,最好使用合适的:std::array。无论如何,原始数组也可以。 + 我认为这很可能是 OP 的真正目标:元素序列的每个 构造 都有不同的值。 除非整数 i 可以转换为 myClass,否则您的代码将无法编译。我不知道谁对你的答案投了赞成票。 @icando:看问题,默认的ctor是myClass(int i=0)(省略explicit,这是一个非常糟糕的主意)。 @icando:See it live。单参数构造函数提供了您似乎认为缺失的非常“除非”的情况。而“谁投票”就在您之前的评论中。【参考方案2】:

如何在不单独输入名称的情况下创建多个类实例?

答案是您创建了一个数组,但不是您尝试的方式。

像这样:

int main()

    MyClass myInstance[10];

    for(int i = 0; i < 10; i++)
    
        myInstance[i].myClassFunction();
    

提示:不要使用数组,使用std::vectorstd::array

(参见@Jarod42 的回答)

【讨论】:

【参考方案3】:

解决方案1:使用整数数组作为初始化器,构造函数用于将整数转换为myClass。

class myClass

public:
    //constructor
    myClass( int num) m_number = num;;

    void myClassFunction()cout<< "I am " << m_number << endl;
private:

    int m_number;
;

int main()
    myClass myInstance[10] = 0,1,2,3,4,5,6,7,8,9;
    for ( int i=0; i< 10; i++) myInstance[i].myClassFunction();

解决方案 2:使用静态计数器设置 m_number,因此无需使用非默认构造函数。

class myClass

public:
    //constructor
    myClass()m_number=counter++;;

    void myClassFunction()cout<< "I am " << m_number << endl;
private:

    int m_number;
    static int counter;
;
int myClass::counter = 0;

int main()
    myClass myInstance[10];
    for ( int i=0; i< 10; i++) myInstance[i].myClassFunction();

方案3:在构造函数调用后设置m_number,这样默认构造函数就足够了。

class myClass

public:
    //constructor
    void setNum(int num)m_number=num;;

    void myClassFunction()cout<< "I am " << m_number << endl;
private:

    int m_number;
;

int main()
    myClass myInstance[10];
    for ( int i=0; i< 10; i++) myInstance[i].setNum(i);
    for ( int i=0; i< 10; i++) myInstance[i].myClassFunction();

【讨论】:

【参考方案4】:

就像 Jarod42 的代码:

int main()
    std::vector<myClass> myInstances;
    for(int i = 0; i < 10; ++i) 
        myInstances.push_back(myClass(i));
    
    myInstances[5].myClassFunction();

我认为这些应该可行。

【讨论】:

【参考方案5】:

使用数组:

myClass myInstance[10];

这将创建一个包含 10 个实例的数组,但每个实例的 m_number 设置为 0。

另一种方法:

myClass *myInstance = new myClass[10];

for (unsigned int i = 0; i < 10; i++)

myInstance[i] = new myClass(i);

这里每个实例都有不同的 m_number 值


为了解决上述代码的问题而进行编辑。已经提出了更好的解决方案。

myClass *myInstance[10];

// Allocate
for (unsigned int i = 0; i < 10; i++)

myInstance[i] = new myClass(i);


// At the end free
for (unsigned int i = 0; i < 10; i++)

delete myInstance[i];

【讨论】:

避免原始的拥有指针,改用std::vector。 (顺便说一句,你错过了一个指针)。 @Jarod42:正确的替代方法是智能指针,而不是原始的拥有指针,对吧?尽管在这种情况下任何动态分配都不好。 你分配了2次但没有删除?

以上是关于如何在 C++ 中创建一个类的多个实例的主要内容,如果未能解决你的问题,请参考以下文章

C++ 难以在单例类中创建类的实例

如何防止 start-stop-daemon 在 cronjob 中创建多个实例?

在 C++ 中访问一个类的多个实例

如何在 Java 静态块中创建本地类? [复制]

C#窗体设计——多个窗体之间的调用

如何在 Spring Boot 应用程序中创建第二个 RedisTemplate 实例