我有这个小程序,因为我试图理解向量和作为参数传递的类名。这是程序:
#include<iostream>
#include<vector>
using namespace std;
class objectclass{
public:
void vec_try(){
cout<<"print out something";
}
};
class another{
public:
void run();
vector<objectclass *>ports;
void add_obj(objectclass *p){
ports.push_back(p);
}
};
void another::run(){
//int j=0;
ports[j]->vec_try();
}
int main(){
another a;
a.run();
system("pause");
return 0;
}
我知道将vector中的classname作为对象传递是正常的,然后使用push_back在该向量中插入元素但在函数add_obj(objectclass * p)中如果我不想更改,我如何传递值定义功能。我知道这样的方式:
objectclass *p;
p= new objectclass[10];
但是我的函数已经定义了,而且我想用ports [i]调用函数vec_try(),所以我没有得到如何传递值以及如何使用ports [i]。我基本上需要澄清一下。
答案 0 :(得分:1)
您的add_obj
函数会指向objectclass
个对象。因此,要向向量添加元素,您需要执行以下操作:
another a;
objectclass obj1; // Create an objectclass
a.add_obj(&obj1); // Pass its address to add_obj
objectclass obj2;
a.add_obj(&obj2);
objectclass obj3;
a.add_obj(&obj3);
当然,你的向量会保留指向这些对象的指针。当这些对象超出范围并被销毁时,这些指针将指向无效对象。但这并不重要,因为你的对象只在main
的末尾被销毁。
另一种方法是动态分配对象:
another a;
a.add_obj(new objectclass());
a.add_obj(new objectclass());
a.add_obj(new objectclass());
每一行动态分配一个objectclass
对象,然后将指向该对象的指针传递给add_obj
。但是,您需要确保最终以某种方式delete
此对象。
你push_back
进入向量的第一个元素将具有索引0,第二个元素将具有索引1,第三个元素将具有索引2,依此类推。
如果在run
中,你想迭代向量中的所有对象,你可以这样做:
for (int i = 0; i < ports.size(); i++) {
ports[i]->vec_try();
}
如您所见,这会循环遍历向量中的所有元素(从0到ports.size()
)并在每个元素上调用vec_try
。
有一种更好的方法可以使用迭代器来完成此操作,但我将把它留给以后的课程。