C++ 什么是合适的现代C++;允许访问成员std::vector的方法?

C++ 什么是合适的现代C++;允许访问成员std::vector的方法?,c++,C++,我有一个类,它有一个指针对象数组,我正在将它转换为std::vector实现。我对“现代”C++新手。 当前,该类公开的数组类型如下: class foo { private: CustomContainer<foo> m_listOfFoos; public: foo CreateFoo(); // Makes a foo, adds it to the list. foo GetFoo( int i ); // R

我有一个类,它有一个指针对象数组,我正在将它转换为
std::vector
实现。我对“现代”C++新手。

当前,该类公开的数组类型如下:

class foo
{
private:
    CustomContainer<foo> m_listOfFoos;

public:
    foo  CreateFoo();            // Makes a foo, adds it to the list.
    foo  GetFoo( int i );        // Returns a foo
    int  GetListSize( );         // Returns the number of foos in the list
    void RemoveFoo( int i );     // Removes a foo
    void SortList();             // Sorts the list of foos in a custom way
};
class-foo
{
私人:
海关集装箱货物清单;
公众:
foo CreateFoo();//生成一个foo,将其添加到列表中。
foo GetFoo(inti);//返回一个foo
int GetListSize();//返回列表中的foo数
void RemoveFoo(int i);//删除一个foo
void SortList();//以自定义方式对foo列表进行排序
};
该公司使用2002年编写的定制容器,
foo
实际上是一个指向复杂类的指针,但除此之外,这与实际情况非常接近。我已经开始计算从这个容器到
std::vector
的转换

我想知道什么是最好的现代C++实践,它提供成员函数来与容器交互。 我是否应该更新我们已有的成员函数?或者是有一些现代C++魔术允许我访问容器到另一个类,这样他们就可以更好地添加、删除和迭代向量?


是否有办法将std::vector公开,但只允许读取?或者一种返回迭代器类的方法来实现这一点?

除非您有理由更改接口(并且确实存在有效的理由),否则我不会碰它

这些合理的原因可能包括维护人员更加熟悉,他们以前使用过
vector
s,但没有使用您的自定义界面。您可以通过
const
上下文中的
const
引用来公开向量,以防止修改

请注意,这样一个清晰的界面并不难找到,这样,如果您愿意,可以在访问周围粘贴互斥锁。事实上,一个好的接口的优势在于,您可以交换其备份数据存储,而无需向任何消费者公开该更改


换句话说,您的问题确实没有通用的答案,但到目前为止,我看不出有理由更改您的界面。当然,至少在我看来,公开向量的“惯用”方式(和/或不公开的理由)近年来没有改变。

这看起来像是一个误用封装的案例。如果外部类需要直接访问您的私有数据成员,那么该成员首先不应该是私有的。无论如何,我不建议更改现有类的接口,相反,如果您希望调整现有类的接口以匹配您的新用例,适配器模式可以派上用场

一种选择是只添加一个函数,该函数返回对
m_listofoos
的(const)引用。尽管这通常被认为是一种代码气味,因为它暴露了您的实现。
std::vector
自C++98以来就存在了。使用它与旧VS现代C++无关。但是,当您更改internal时,不需要更改接口。Re:“我已经开始计算从这个容器到std::vector的转换。”为什么?这里的目标是什么?一般来说,如果它没有损坏,就不要修复它。转换为std::vector是因为容器依赖于一个不跨平台的库。解决这个问题比换掉容器要困难得多。容器的内容必须得到保护。如果外部类在容器中添加、删除或删除了项,则会导致错误。该类和使用该类的类都将被重写,这是有充分理由的。我不必改变界面,但知道设计这个界面的正确方法对我来说还是很有教育意义的。@Jimbo这里很难笼统地说,但是如果这个界面以前对你来说是“正确的方法”,现在它仍然是“正确的方法”,不管它背后的容器是什么。日历上的日期不会改变这一点。现在,“为你”是最重要的一句话,因为这一切都没有“正确的方法”。)我们要记住问题的范围。我不是说我必须改变它或者我想改变它。我在问是否有一种更现代的方法来处理一个STD::向量,我知道作为一个已经用C++工作了30年的开发者,但语言的一个非常有限的子集。总而言之,你的回答很有帮助。@Jimbo和我已经说过几次了,现在没有了。对不起,我不知道该怎么说。祝你好运