2011-07-18 155 views
1

我正在解析一个文件并创建一个向量的Foo对象向量。C++ - 返回常量对象的常量向量const的向量

vector< vector<Foo*> > mFooVectors; 

我必须允许访问以下getFoos函数。

const vector<const Foo*>&   getFoos(int index); 

所以我创造了我的向量的常量声明:

const vector< const vector<const Foo*> > mConstFooVectors; 

现在我该怎么办mConstFooVectors = mFooVectors这样我就可以回到mConstFooVectors参考?

+0

如果可以,更改'getFoos'的接口。问题是'const vector '不能像'T const * const *'可以提供'T **'原始指向的不可变视图一样的方式提供'vector '的不可变视图。 '。该标准保证'T *'和'const T *'具有相同的对象表示,因此允许指针转换,但'vector'不能“知道”并且不允许相应的转换。 –

+0

所以,如果你想要提供一个'mFooVectors'的视图来禁止修改(对向量或者这些指针末尾的任何东西),你真的需要返回迭代器。例如,你可以编写你自己的迭代器类来包装向量迭代器,或者你可以写一个Visitor-pattern-style函数来代表调用者进行迭代。 –

+0

@保罗 - 只是猜测downvoter,看到'矢量',发现问题的其余部分不感兴趣。它只是不起作用。 –

回答

0

向量的拷贝构造函数应该能够处理它,但是你必须在类的构造函数的初始化列表中完成它,因为它是一个const成员。

编辑:这是错的...... Vector的复制构造函数无法处理它。请参阅David Rodriguez的文章以获得解释(向量和向量是无关的类型)。

+0

我显然不知道const如何工作:) – Mark

7

您无法在任何给定的级别添加const。模板的不同实例是不同的无关类型,vector<T>vector<const T>无关,并且没有办法将从一个转移到另一个。

另一方面,您可以创建一个不同的向量并只复制内容,但这可能会很昂贵,因为您必须复制所有不同的载入向量。

顺便说一句,如果返回一个const参考外载体中,const引用将表现为:const std::vector< const std::vector< Foo * const > >&,请注意,因为相关联的在C++类型的值语义,常量性中传播的。问题在于存储在内部向量中的值是一个指针,并且使该指针保持不变不会使指向的对象保持不变。同样,您的getFoos(int)的行为将等于const std::vector< Foo * const >&。请注意,这是行为不是实际的类型

+2

使用'vector '将会失败,因为value_type必须是可赋值的。 –

+0

@Bo:好,好点。我甚至没有想过我们在这里讨论的模板的细节。但这是一个很好的观点:STL容器对类型有特定的要求,而常量类型不会削减它。 +1 –

+0

@BoPersson在C++ 03中是真的。在C + + 11它不,但是[看到这里](http://stackoverflow.com/questions/6954906/does-c0x-allow-vectorconst-t)。 –

1

我不知道你正在尝试做的,但我会看看的boost :: ptr_vector

特别的,你的矢量成员有可能,如果你不正确处理泄漏.. (RAII)

0

你是混合

vector<const Foo *> 

vector<Foo *> 

你甲肝e决定你想要哪一个 - 没有办法从一个转换到另一个(没有制作副本)。

+0

我在问如何制作该副本,但显然这是不可能的。 – Mark