2013-03-26 76 views
0

我有这个小程序,因为我想了解向量和作为参数传递的类名。下面是该程序:classname作为一个对象向量和参数的功能push_back

#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; 
} 

我有想法,通过类名在向量作为对象是细,然后使用的push_back插入该矢量但在功能add_obj元素(对象类* P)如何传递值,如果我不想改变函数的定义。我知道这样的方式:

objectclass *p; 
p= new objectclass[10]; 

,但我的功能已认定中的,也是我想调用函数vec_try()与港口[I],所以我没有得到如何通过价值观和如何正在与港口[我]。我基本上需要澄清一些。

+0

第三次阅读本文后,我不知道你在问什么。 – Chad 2013-03-26 15:23:39

+0

我不明白你在问什么。你能澄清一下吗?你想要达到什么目标? – 2013-03-26 15:25:15

+0

我应该在add_obj()中传递什么,因为它不允许我像add_obj(objectclass * p)或与&p或任何东西,所以我怎么称呼这个我的意思是在函数中的参数。 – networks 2013-03-26 15:28:00

回答

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

有一个更好的方法来使用迭代器来做到这一点,但我会留给未来的课程。

+0

非常感谢你解决了我的疑惑 – networks 2013-03-26 16:58:20