在 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 <vector>
)
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++ 运行时动态创建类对象的主要内容,如果未能解决你的问题,请参考以下文章