读取私有变量类成员 我是C++的新手,我需要从一个类中的私有类成员中读取一个不同的类中的方法,例如: class a{ private: int x; } class b{ void foo(); } void b::foo(){ //here I want to read from x that's in a }
我是否必须在读取私有变量类成员 我是C++的新手,我需要从一个类中的私有类成员中读取一个不同的类中的方法,例如: class a{ private: int x; } class b{ void foo(); } void b::foo(){ //here I want to read from x that's in a },c++,class,c++11,private,C++,Class,C++11,Private,我是否必须在类a中设置一个函数,比如int readx(){return x);)或a readclass(){return*this);}?还有其他方法吗?您可以使用友元类或函数,但使用方法的私有成员是个坏主意(测试是唯一合理的借口)。如果无法避免使用私有成员,最好使用公共方法,或者重新设计代码。您可以实现一个可以访问foo中x的friend函数 如果类a中没有此数据成员的访问器,则应将类b的成员函数声明为类a的友元函数 比如说 #include <iostream> class
类a
中设置一个函数,比如int readx(){return x);)
或a readclass(){return*this);}
?还有其他方法吗?您可以使用友元类或函数,但使用方法的私有成员是个坏主意(测试是唯一合理的借口)。如果无法避免使用私有成员,最好使用公共方法,或者重新设计代码。您可以实现一个可以访问foo中x的friend函数
如果类a中没有此数据成员的访问器,则应将类b的成员函数声明为类a的友元函数 比如说
#include <iostream>
class B
{
public:
void foo() const;
};
class A
{
public:
A( int x ) : x( x ){}
private:
friend void B::foo() const;
int x;
};
void B::foo() const
{
A a { 10 };
std::cout << a.x << std::endl;
}
int main()
{
B().foo();
return 0;
}
#包括
B类
{
公众:
void foo()常量;
};
甲级
{
公众:
A(intx):x(x){}
私人:
friend void B::foo()常量;
int x;
};
void B::foo()常量
{
A A{10};
std::cout类的私有部分的目标是“隐藏”处理数据的方式,提供一种使用公共方法访问所述数据的简化方式。
使用公共方法更改私有成员的值的优点是,例如,您可以只允许“x”的值介于0和10之间
在您的情况下,您应该考虑“x”在第一个类中代表什么,以及第二个类直接访问它是否有意义,而不需要任何控制或特殊考虑。如果是这种情况,它可能是一个公共值。在另一种情况下,您需要创建一个公共方法来读取它,如readx examp乐。
如果只有“b”具有直接访问“x”的权限,那么您还可以定义一个friend函数,就像有人说过的那样
请注意,返回指向实例的指针将不允许访问该类的私有成员。声明友元
函数或类将授予该函数或类对a的x的读写访问权限,a
class a {
public:
const int& readx() const { return x; }
private:
int x
};
或者,如果你更喜欢这个语义
class a {
public:
const int& x() const { return x_; }
private:
int x_;
};
仅授予读访问权限,但对每个客户端都有。
可以使用可以访问X的朋友函数。您应该认为它可能是出于某种原因而被声明的。@ Neelkrk:对,例如,如果类的设计者想要在以后扩展到多线程环境中使用它,未经审核的状态访问是一个游戏杀手。@NeilKirk我在好几个地方读到所有类变量都应该是私有的。你应该发布更多的内容,因为链接可能会在将来消失。为什么在函数名后面加上const?@kuhaku第一个const
,以确保只读访问(注意它是一个ref,而不是返回的值)除此之外,在C++中(C)中的一个一般的经验法则是:习惯用法>代码> const,作为const CAN < /COD>——不必是可变的,应该总是声明为-<代码> const >。
那是什么?@kuhaku这就是所谓的ctor初始化。冒号后的表达式x(x)使用参数x的值初始化数据成员x。