在 C++ 运行时动态创建类对象

Posted

技术标签:

【中文标题】在 C++ 运行时动态创建类对象【英文标题】:Dynamically creating class objects during runtime in C++ 【发布时间】:2013-12-09 02:25:18 【问题描述】:

我试图在运行时创建对象。我有未指定数量的对象要创建,我完全迷失了。有人告诉我要使用指针来执行此操作,但即使使用指针我也不知道该去哪里。

这是我的代码。

#include <iostream>
#include <string>
using namespace std;

class Consumer

public:
    int idNum;
    string info;
    int maxHours;
    Consumer(int, string, int);
    void display();
    void newCons();
;

Consumer::Consumer()

    idNum = id;
    info = in ;
    maxHours = hrs;


void Consumer::newCons()

    int idn;
    string npa;
    int mhrs;
    cout << "Please input the consumer's ID number." << endl;
    cin >> idn;
    cout << "Please input the consumer's full name, phone number, and address." << endl;
    cout << "Do not press enter until you have entered all three." << endl;
    cin >> npa;
    cout << "Please input the max number of hours the consumer spends purchasing products each week." << endl;
    cin >> mhrs;

    Consumer anotherCons(idn, npa, mhrs);

    return;


void Consumer::display()

    return;


int main()

    int i, howMany;
    Consumer* anotherCons;
    anotherCons = new Consumer();

    anotherCons->newCons();

    return 0;

【问题讨论】:

提示:你构造的签名不匹配 谢谢,都是玩的,还没清理测试部分。 这是你的真实代码吗?它不应该编译.. 它没有。我在编程方面很新。这些是我试图开始工作的测试项目。它不编译。在提交之前,我没有解决所有测试错误。对不起。 【参考方案1】:

使用std::vector: (#include &lt;vector&gt;)

vector<Consumer> list;
for(int i = 0; i < num_you_want_to_create; ++i)
    Consumer c; //declare an object of type consumer, if it doesn't work, try:
    //Consumer c(1, "test", 1);
    list.push_back(c); //creates a new consumer

【讨论】:

(64): error C2512: 'Consumer' : 没有合适的默认构造函数可用 是的,那是因为你定义了一个默认构造函数,但没有在你的类中声明它 构造函数不是Consumer吗?我把它改成: 公开:int idNum;字符串信息;诠释最大小时;消费者(整数,字符串,整数);无效显示();无效的新康斯(); ; Consumer::Consumer(int id, string in, int hrs) idNum = id;信息=在;最大小时 = 小时; 有了三个数据成员,它就可以工作了。我将如何访问它以显示信息?【参考方案2】:
anotherCons = new Consumer();
//            ^^^^^^^^^^^^^^

在这里,您正在调用 Customer 类的默认构造函数。您已经为您的类定义了一个,但它没有前向声明(在类主体中进行原型化)。您有一个构造函数定义为:

Customer(int, string, int);

但这提供了一个完全不同的构造函数。你需要有一个默认构造函数的原型以及一个专门的构造函数:

Customer();
Customer(int, string, int);

此外,在您的newCons 方法中,您调用了上面的参数化构造函数。这将再次导致错误,因为您没有在给我们的代码中的任何地方定义构造函数。你的构造函数应该这样定义:

Customer::Customer(int id, string in, int hrs)
    : idNum(id), info(in), maxHours(hrs)
 

这里我们使用 member-initializer 列表。您也可以将其与默认构造函数一起使用。


@awesomeyi 说的对,您可以使用std::vector 在运行时动态添加对象。这比手动分配内存要好,因为它是由向量的构造函数/析构函数手动完成的。

此外,我认为您的newCons 函数应该更改为:

static Consumer newCons();

我在返回类型中添加了static Consumer,并去掉了void。我为什么这样做?好吧,我返回Consumer,因为它符合函数的语义——你想创建一个新的Consumer 对象,但是当你创建它时你会用它做什么呢?好吧,您必须将对象返回给调用者,以便他们可以使用它,所以我决定最好返回一个新对象。在最后一行你会做:

Consumer anotherCons(idn, npa, mhrs);
return anotherCons;

return Consumer(idn, npa, mhrs);

到目前为止,这很棒。 main 的正文如下所示:

int main()

    std::vector<Consumer> v;
    v.push_back(Consumer());

    v.at(0) = Consumer::newCons();

这只是main 的一个例子。你的真实代码可以是任何东西。

就个人而言,我认为最好为Consumer 对象定义一个提取器,因为它符合标准IOStreams 库的感觉。例如:

std::istream& operator>>(std::istream& is, Consumer& c)

    c = Consumer::newCons(is);
    return is;

这也需要 Consumer::newCons 带一个参数:

static Consumer newCons(std::istream& is)

并使用is 代替cin

现在:

int main()

    std::vector<Consumer> v;

    Consumer c;
    std::cin >> c;

    v.push_back(c);

【讨论】:

以上是关于在 C++ 运行时动态创建类对象的主要内容,如果未能解决你的问题,请参考以下文章

C++动态创建类的对象

c++基础——动态内存

GroovyMOP 元对象协议与元编程 ( Expando 动态类 | 创建动态类 | 为动态类增加字段和方法 )

在 C++ 中的类中创建类对象的动态数组

动态创建对象 C++

是否可以在 C++ 运行时动态创建函数?