当容器作为私有成员在一个类中时,如何访问容器方法?

时间:2014-02-06 15:51:22

标签: c++ containers

我有一个简单的问题。我有一个班级说A与私人成员是一个stl容器,例如一个int的向量。有没有办法使用它的方法(例如大小,调整大小等......)?经典的“获取功能”是否足够?

Class A
{
private:
    std::vector<int> v;
public:
    std::vector<int> get_v() {return v;};
};

如果是,是不是“获取功能”只是为了获取会员而不是修改会员?

非常感谢

3 个答案:

答案 0 :(得分:3)

这里通常要做的是将常量引用返回给数据成员:

const std::vector<int>& get_v() const
{
    return v;
}

请注意,我也使该功能保持不变。这告诉您该函数不会修改类中的任何数据成员。

目前,您正在对矢量进行深度复制,这在性能方面很昂贵,并且会使您与原始数据分离。

如果你想调用resize之类的方法(改变向量),那么你也可以在C ++中提供函数的非常量版本(const上的重载):< / p>

std::vector<int>& get_v()
{
    return v;
}

如果您对const的实例有const指针(或引用),编译器将调用A版本。否则,如果将调用非const版本。

答案 1 :(得分:0)

getter将返回内部向量的副本。您所做的任何修改只会影响副本。如果您还提供了一个setter,以便修改后的副本可以传回,那么你可以这样做:

A a;
std::vector<int> v = a.get_v();
v.push_back(5);
a.set_v(v);

或者,您可以让getter返回对内部向量的引用(因此它的返回类型为std::vector<int>&,然后您可以从外部修改它。

答案 2 :(得分:0)

您的get方法返回数据成员的副本。所以这样的方法不允许修改原始向量,

如果要提供对向量元素的访问,可以重载operator []或使用参数编写get方法。

例如

Class A
{
private:
    std::vector<int> v;
public:
    int operator []( std::vector<int>::size_type n ) const { return v[n]; }
    int & operator []( std::vector<int>::size_type n ) { return v[n]; }
};

或者您可以编写执行相同的get方法

Class A
{
private:
    std::vector<int> v;
public:
    int get( std::vector<int>::size_type n ) const { return v[n]; }
    int & get( std::vector<int>::size_type n ) { return v[n]; }
};

至于使用向量的副本或对它的引用以获得其大小的想法,那么这不是一个好主意。最好提供一个返回向量大小的方法。在这种情况下,用户界面将不依赖于容器的类型。