如何解决值是按引用还是按值存储在std :: pair <>中?
所以我有一个类myClass
,并有两个私有变量,让我们说i,j和一个类方法myMethod
如下-
std::pair<int,int > myClass::myMethod(void)
{
std::pair<int,int> Pair;
this->i = 100;
this->j = 50;
Pair.first = this->i;
Pair.second = this->j;
return Pair;
}
我正在从另一个函数中调用以下方法-
std::pair<int,int> receivedPair = myClass.myMethod();
所以,如果我编辑receivedPair
说
receivedPair.first = 200;
Class变量i
是否也等于200?
我本质上需要通过引用将变量传递给串联的几个函数,以便更新相同的内存位置。
TIA
解决方法
std::pair
的值是按值。
尽管您可以使用
std::pair<std::reference_wrapper<int>,std::reference_wrapper<int>>
作为类型。
参考:https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper
,在您的特定情况下,std::pair
仅仅是这么多:
struct pair {
int first;
int second;
};
您的first
中的 second
和std::pair
是非引用类成员。 std::pair
的完整定义几乎是
template<typename T1,typename T2> struct pair {
T1 first;
T2 second;
};
,
在您提供的示例中,由于您将类型声明为std::pair<int,int>
,因此这些值按值存储。如果您要通过引用存储值,可以执行以下操作:
std::pair<int&,int&> myClass::myMethod(void)
{
this.i = 100;
this.j = 50;
std::pair<int&,int&> Pair(this.i,this.j);
return Pair;
}
P.S。我之所以仅添加此答案,是因为我认为先前使用std::reference_wrapper
的答案不会让您修改引用的内容!然后我发现您可以使用.get()
修改内容。
std::pair
存储您所讲的内容。您可以使用std::pair<int&,int&>
。但是,作为成员的引用有一些缺点。复制,默认构造以及更多问题/无法实现。
与其使用一对引用,不如使用一对引用可能更容易:
struct myClass {
std::pair<int,int>& myMethod() {
return data;
}
private:
std::pair<int,int> data;
};
我声称,如果您不能给成员更好的名字,而不是i
和j
,那么data.first
和data.second
一样好。另一方面,如果您可以给出更好的名称,请这样做:
struct my_i_and_j {
int some_meaningful_name;
int another_meaningful_name;
};
struct myClass {
my_i_and_j& myMethod() {
return data;
}
private:
i_and_j data;
};
但是,请注意,返回对私有数据的非常量引用会破坏封装。一旦调用者获得了非const引用,他们就可以直接修改私有数据,并且您可以(应该)将其公开,以减少样板并提高清晰度。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。