创建包含引用的对象数组

时间:2012-02-29 08:36:12

标签: c++ arrays object pointers reference

处理以下情况的最佳方法是什么?

假设我有一些应该像这样的东西

class Foo
    {
    public:
         Foo(Bar& bar):m_bar(bar){}
    private:
         Bar& m_bar;
    };

Foo:s必须有对Bar的有效引用:s。不同的Foo:s需要不同或相同的Bar:s。

我想将Foo存储在一个数组中。但是,由于Foo需要一个非默认的构造函数,它将无法工作。

我可以创建一个指向Foo:s的指针数组,但是我需要为该数组中的每个对象调用new和delete。

我可以这样定义Foo

class Foo
    {
    public:
         void init(Bar& bar)
             {
             m_bar=&bar;
             }
    private:
         Bar* m_bar;
    };

,但是可以创建未初始化的Foo:s。

某种新的展示位置怎么样?

3 个答案:

答案 0 :(得分:0)

您可以使用指针,但不使用原始指针使用unique_ptrs。这些在c ++ 11中可用,但如果您使用较旧的编译器,则可以使用boost实现。

例如

class Foo
{
public:
  Foo(unique_ptr<Bar> bar):m_pBar(bar){}
private:
  unique_ptr<Bar> m_pBar;
};

这样您就不必担心在Bar对象上调用delete,因为一旦没有对它们的引用就会删除它们。

然后你可以像这样使用Foo

unique_ptr<Bar> pBar(new Bar());
Foo(pBar);

编辑:更改为使用unique_ptr而不是shared_ptr并添加了示例用法

答案 1 :(得分:0)

首先,对不起我的第一个回答我错了。 我希望这是一个更好的解决方案:你可以创建一个vector元素而不需要像这样的默认构造函数:

#include <iostream>
#include <vector>

using namespace std;


class Foo 
{ 
public: 
    Foo(int& bar): m_pBar(bar)
    { } 

    Foo& operator=(const Foo& other)
    { m_pBar = other.m_pBar;  }

    int Get()
    { return m_pBar; }

private: 
    int& m_pBar; 
}; 


int main(int argc, char** argv)
{
    int test[10]  = { 0 };

    vector<Foo> vect;
    for (int& i: test)
        vect.emplace_back(i);

    test[0] = 1;
    cout << vect[0].Get() << endl;

    return 0;
}

答案 2 :(得分:0)

最后,我使用以下构造函数实现了一个自定义容器:

template<class T>
template<class U,class V>
Array<T>::Array(unsigned int n,U source_iterator,const V& source_resource):memory(n*sizeof(T))
    {
    data=(T*)memory.pointerGet();
    unsigned int k;
    try
        {
        for(k=0;k<n;k++)
            {
            new(data+k)T(*source_iterator,source_resource);
            ++source_iterator;
            }
        }
    catch(...)
        {
        while(k>0)
             {
             k--;
             data[k].~T();
             }
        throw;
        }
    length=n;
    capacity=n;
}