Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在类中操纵向量的成员_C++_Vector_Operator Overloading - Fatal编程技术网

C++ 在类中操纵向量的成员

C++ 在类中操纵向量的成员,c++,vector,operator-overloading,C++,Vector,Operator Overloading,我刚开始上写作课,有以下问题。 假设我有以下课程: 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; publi

我刚开始上写作课,有以下问题。 假设我有以下课程:

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);}
};
class foo\u cont
{
私人:
向量foo_vec;
公众:
foo_cont(){}
void add_元素(foo f1){foo_vec.push_back(f1);}
};
假设我安装了
foo\u cont f1并用
foo
的实例填充
foo\u-vec
。如何使用
set\u bar()
修改
foo\u vec
的元素

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

您可以为类
foo\u cont
定义
操作符[]
。比如说

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 );

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

您可以为类定义
操作符[]
。比如说

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 );
在任何情况下,如果要在类范围之外更改向量的元素,都需要为它们提供访问器

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

类内
foo\u cont

如果要对
foo\u cont
中向量的第一个元素调用
set\u bar()
,请使用:

foo_vec[0].set_bar(10);
foo_vec[n].set_bar(10);
如果要在
foo\u cont
中的向量的
n
-th(按索引)元素上调用
set\u bar()
,请使用:

foo_vec[0].set_bar(10);
foo_vec[n].set_bar(10);
由该类用户提供

您可以通过运算符函数或向向量本身提供访问函数来访问
foo_-vec
n
-th元素

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();
foo_cont f1;
f1.add_element(10);
int a = f1.get_foo_vector()[0].get_bar();

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

类内
foo\u cont

如果要对
foo\u cont
中向量的第一个元素调用
set\u bar()
,请使用:

foo_vec[0].set_bar(10);
foo_vec[n].set_bar(10);
如果要在
foo\u cont
中的向量的
n
-th(按索引)元素上调用
set\u bar()
,请使用:

foo_vec[0].set_bar(10);
foo_vec[n].set_bar(10);
由该类用户提供

您可以通过运算符函数或向向量本身提供访问函数来访问
foo_-vec
n
-th元素

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();
foo_cont f1;
f1.add_element(10);
int a = f1.get_foo_vector()[0].get_bar();


foo\u计数
中的
向量
有一个
而不是
foo
。这是一个打字错误吗?你是在问我们如何对向量中包含的元素调用函数吗?使用索引:
foo\u vec[i]。设置工具栏(0)。即使foo_vec是私有的,我真的可以这样做吗?
foo_count
中的
vector
有一个
bar
而不是
foo
。这是一个打字错误吗?你是在问我们如何对向量中包含的元素调用函数吗?使用索引:
foo\u vec[i]。设置工具栏(0)。即使foo_-vec是私有的,我真的可以这样做吗?我相信OP是特别要求通过
foo_-cont
public API来实现的。从莫斯科的回答中可以看到Vlad。如果我没有以正确的方式提问,我想在我的主要部分中有一个foo_cont实例。我如何访问foo_vec,即使它是foo_cont实例的私人成员?我相信OP是专门询问如何通过
foo_cont
公共API进行访问。从莫斯科的回答中可以看到Vlad。如果我没有以正确的方式提问,我想在我的main中有一个foo_-cont实例,那么即使它是foo_-cont实例的私有成员,我如何访问foo_-vec?好的,如果我的for_-cont实例名为f1,我可以执行f1[I]。设置_-bar(10)?是否需要重写[]运算符两次?这样做的目的是什么?@PtK使用常量对象或对象的常量引用时,需要第二个运算符。例如,如果您有一个通用函数f(const foo_cont&c);在函数中,只能使用为常量对象设计的运算符的第二个重载。确定如果我的for_cont实例名为f1,我可以执行f1[I]。是否设置_栏(10)?是否需要重写[]运算符两次?这样做的目的是什么?@PtK使用常量对象或对象的常量引用时,需要第二个运算符。例如,如果您有一个通用函数f(const foo_cont&c);在函数中,只能使用为常量对象设计的运算符的第二个重载。