【问题标题】:Manipulate members of vector in class在类中操作向量的成员
【发布时间】:2016-01-25 14:46:01
【问题描述】:

我正在开始写作课程并且有以下问题。 假设我有以下课程:

class foo
{
private:
    int bar;
public:
    foo(int bar): bar(bar){}
    void set_bar(int ubar){bar=ubar;}
    int get_bar(){return bar;}
};

现在我想编写一个包含foo 实例的类。

class foo_cont
{
private:
    vector<foo> foo_vec;
public:
    foo_cont(){}
    void add_element(foo f1){foo_vec.push_back(f1);}
};

假设我创建了一个foo_cont f1; 的实例并用foo 的实例填充foo_vecit。如何用set_bar()修改foo_vec的元素?

编辑: 由于我对堆栈溢出很陌生,这可能是一个非常愚蠢的问题,但为什么我会被否决?

【问题讨论】:

  • foo_count 中的vector 有一个bar 而不是foo。是错字吗?
  • 您是在问我们如何对向量中包含的元素调用函数吗?
  • 使用索引:foo_vec[i].set_bar(0);。而且这根本不是好的设计。
  • 即使 foo_vec 是私有的,我真的可以这样做吗?

标签: c++ vector operator-overloading


【解决方案1】:

您可以为类foo_cont 定义operator []。例如

class foo_cont
{
private:
vector<bar> foo_vec;
public:
    // ...
    bar & operator []( size_t i )
    {
        return foo_vec[i];
    }   
    const bar & operator []( size_t i ) const
    {
        return foo_vec[i];
    }   
};

例如

for_cont[i].set_bar( 10 );

在任何情况下,如果要在类范围之外更改向量元素,则需要为它们提供访问器。

【讨论】:

  • 好的,如果我的 for_cont 实例被称为 f1 我可以做 f1[i].set_bar(10) 吗?我需要覆盖 [] 运算符两次吗?这样做的目的是什么?
  • @PtK 当使用常量对象或对象的常量引用时,需要第二个运算符。例如,如果您有一个通用函数 f( const foo_cont &c );在函数中,您只能使用为常量对象设计的运算符的第二个重载。
【解决方案2】:

如何使用 set_bar() 修改 foo_vec 的元素?

类内foo_cont

如果您想在foo_cont 中向量的第一个元素上调用set_bar(),请使用:

foo_vec[0].set_bar(10);

如果您想在foo_cont 中向量的n-th(按索引)元素上调用set_bar(),您可以使用:

foo_vec[n].set_bar(10);

按课程用户

您可以通过运算符函数或通过提供向量本身的访问器函数来提供对foo_vec 的第n 元素的访问。

bar& operator[]( size_t i )
{
    return foo_vec[i];
}   
bar const& operator[]( size_t i ) const
{
    return foo_vec[i];
}   

并将其用作:

foo_cont f1;
f1.add_element(10);
int a = f1[0].get_bar();

std::vector<foo>& get_foo_vector()
{
   return foo_vec;
}

std::vector<foo> const& get_foo_vector() const
{
   return foo_vec;
}

并将其用作:

foo_cont f1;
f1.add_element(10);
int a = f1.get_foo_vector()[0].get_bar();

【讨论】:

  • 我相信 OP 正在专门询问是否通过 foo_cont 公共 API 进行操作。请参阅莫斯科的回答中的弗拉德。
  • 如果我没有以正确的方式提出问题,我想在我的 main 中有一个 foo_cont 的实例,即使它是 foo_cont 实例的私有成员,如何访问 foo_vec?
猜你喜欢
  • 2020-08-25
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多