2013-11-04 37 views
5

我是一位专家级的Java程序员,试图将我的知识移植到C++中。这不是家庭作业,只是一个我试图学习C++的概念。C++ - 将对象添加到std :: vector中,在循环中实例化

我想要做的是使用循环“生成”自定义类型的对象列表。这是我如何在Java中做到这一点:

public class TestClass 
{ 
    private ArrayList<ExampleClass> _exampleObjects; 
    private int _numObjects = 10; 

    public void populateList() 
    { 
     _exampleObjects = new ArrayList<ExampleClass>(); 

     for(int i = 0; i < _numObjects; i++) 
     { 
     _exampleObjects.add(new ExampleClass()); 
     } 
    } 

    public void doStuffWithListItems() 
    { 
     for(ExampleClass e : _exampleObjects) 
     { 
     e.performAction(); 
     } 
    } 
} 

超级简单的东西。创建一个列表,遍历一个任意的循环并向它添加对象。然后,循环访问这些对象并将其用于任何目的。

TestClass.h:

class TestClass 
{ 
    public: 
     // Constructor, copy constructor, destructor definitions 

     void populateList(); 
     void doStuffWithListItems(); 
    private: 
     std::vector<ExampleClass> _exampleObjects; 
     const int _numObjects = 10; 
}; 

TestClass.cpp:

void TestClass::populateList() 
{ 
    for(int i = 0; i < _numObjects; i++) 
    { 
     ExampleObject obj; 
     _exampleObjects.push_back(obj); 

     /* What actually goes here in place of obj? */ 
    } 
} 

void TestClass::doStuffWithListItems() 
{ 
    for(auto it = _exampleObjects.begin(); it != _exampleObjects.end(); it++) 
    { 
     /* What do i do with my iterator to access my object? */ 
    } 
} 

它我的理解是,我在初始化第一个循环我的对象,他们走出去的范围和最终死亡每个循环迭代。是对的吗?如果是这样,我该如何创建一个持久化实例?

我用shared_ptr <>进行了实验,显然能够持久地存储它们,但是在我的生活中却无法解决如何从shared_ptr的迭代器中取消引用。

我觉得这应该是一个非常简单的概念。我似乎无法解决这个问题。我已经阅读了很多关于C++范围和循环的内容。我似乎无法在两者上找到任何东西。

回答

5
ExampleObject obj; 
_exampleObjects.push_back(obj); 

/* What actually goes here in place of obj? */ 

没有。你有什么是正确的,假设ExampleClass有一个工作拷贝构造函数。如果你的编译器支持C++ 11(并且因为你使用的是auto,它至少部分是这样),你可以保存一份副本。

_exampleObjects.emplace_back(); 

这在载体构建体在适当位置的对象,转发的参数(在这种情况下无)至一个匹配的构造(默认构造函数,在这种情况下)。对于从迭代器访问对象,请执行以下操作:

for(auto it = _exampleObjects.begin(); it != _exampleObjects.end(); it++) 
{ 
    it->performAction(); 
} 

同样,C++ 11在这里可以使事情变得更好。

for(auto & obj : _exampleObjects) 
{ 
    obj.performAction(); 
} 

它我的理解是,我在初始化第一 环路我的对象,他们走出去的范围和每个循环迭代结束时死亡。

正确。

如果是这样,我该如何创建一个持久化实例?

vector<>::push_back照顾这个。它将参数复制到矢量中。换句话说,它不是在循环中创建的同一个对象,而是一个副本。您只需确保ExampleClass具有非破坏的复制语义。

不能为我的生活工作如何从 迭代一个shared_ptr的非关联<>

如果你有一个迭代器共享指针的向量,(称之为it ),你会取消对它的引用,并调用存储对象的成员函数,就像这样:

(*it)->performAction(); 
// alternatively 
(**it).performAction(); 
+0

谢谢。这是一个理想的答案。 :D –

+0

@ScottDrew:我添加了一些额外的信息来澄清你在代码之后提出的问题,以防你仍然在想这件事。 –

+0

谢谢,额外的信息确实有帮助。我觉得我现在已经开始充分掌握C++,以便在真正的项目中实际使用它。闪电般的快速回答我无法感谢你。 –

1

理想的答案表明,一个非常糟糕的主意 - 使用后增量++在循环迭代。 你永远不应该在循环中使用它,你只需要迭代,因为postincrement必须返回迭代器在增量之前的值;所以,以前的值需要在之前的某处复制。 从性能角度来看,这只是一个不好的代码风格标志。

+0

你说得很好。虽然我并不是真的提出了后增量,但我只是复制了OP的循环,因为这不是问题所在。 –

相关问题