Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.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++_Encapsulation - Fatal编程技术网

C++ 访问私人成员

C++ 访问私人成员,c++,encapsulation,C++,Encapsulation,我有一门课: class A { private: ComplexClass member1; public: getMember1(){return member1;}; }; 我有一个实现,为了简化代码(更容易理解),需要检索该成员1才能使用它。我首先想到的是: ComplexClass *myComplexClass = &getMember1(); myComplexClass.getSomething(); myComplexClass.getSomethingElse(

我有一门课:

class A
{
private:
ComplexClass member1;

public:
getMember1(){return member1;};
};
我有一个实现,为了简化代码(更容易理解),需要检索该成员1才能使用它。我首先想到的是:

ComplexClass *myComplexClass = &getMember1();

myComplexClass.getSomething();
myComplexClass.getSomethingElse();
etc.
这显然是不正确的,因为我正在从一个新对象而不是从member1检索指针(并得到一个编译器警告)

我的问题是:做这样的事情最好的设计是什么?如何保持封装,同时使用指向它的指针方便成员的访问?(我只想读member1,不想在上面写字)

我应该做一个决定吗

ComplexClass *getPointerToMember1()

在A类中?

常量引用将阻止它们进行编辑。在我看来,它比常量指针更能让你的意图清晰

class A
{
private:
ComplexClass member1;

public:
const ComplexClass &getMember1(){return member1;};
};

常量引用将阻止它们进行编辑。在我看来,它比常量指针更能让你的意图清晰

class A
{
private:
ComplexClass member1;

public:
const ComplexClass &getMember1(){return member1;};
};

您正在按值返回成员,该值生成
ComplexClass
成员的副本。因此,在调用后续方法(以及编译器告诉您的内容)时,您没有处理实际的成员

<>我认为更为实用的C++方法有助于保持封装和减少耦合,创建一个算法成员:

A::doStuff()
{
    member1.getSomething();
    member1.getSomethignElse();
}
这样,任何使用
类A
的人都不关心实现是否使用
复杂类
,而是知道他们可以告诉
A
做一些工作,并且会以最好的方式完成


编辑以供评论:在这种情况下,我建议在
A
中创建从
ComplexClass
获取值的方法(再次隐藏您的实现)。如果这不合适,那么您可以通过const引用返回实现:
const ComplexClass&getMember1()const{return member1;}
您通过值返回成员,该值创建了
ComplexClass
成员的副本。因此,在调用后续方法(以及编译器告诉您的内容)时,您没有处理实际的成员

<>我认为更为实用的C++方法有助于保持封装和减少耦合,创建一个算法成员:

A::doStuff()
{
    member1.getSomething();
    member1.getSomethignElse();
}
这样,任何使用
类A
的人都不关心实现是否使用
复杂类
,而是知道他们可以告诉
A
做一些工作,并且会以最好的方式完成


编辑以供评论:在这种情况下,我建议在
A
中创建从
ComplexClass
获取值的方法(再次隐藏您的实现)。如果这不合适,那么您可以通过const引用返回实现:
const ComplexClass&getMember1()const{return member1;}

请记住,这可能会使封装更加棘手,因为这意味着您需要引用一个
ComplexClass
对象。(想象一下
a
的未来实现,它不维护成员变量,而是根据需要动态创建
ComplexClass
对象。)Ok。但我相信:ComplexClass myComplexClass=A.getMember1();myComplexClass.someInteger=10;是有效的实现。@给定示例,我们已经创建了一个对象。从措辞上看,我认为代码已经耦合得有点太高了。我认为这对于一个奇怪的单元测试很有用。@J.C.Leitão如果你用它来做一个副本,它将是有效的。它不会编辑存储在
A
中的版本,该版本符合您的要求。请记住,这可能会使封装更加复杂,因为这意味着您需要引用
ComplexClass
对象。(想象一下
a
的未来实现,它不维护成员变量,而是根据需要动态创建
ComplexClass
对象。)Ok。但我相信:ComplexClass myComplexClass=A.getMember1();myComplexClass.someInteger=10;是有效的实现。@给定示例,我们已经创建了一个对象。从措辞上看,我认为代码已经耦合得有点太高了。我认为这对于一个奇怪的单元测试很有用。@J.C.Leitão如果你用它来做一个副本,它将是有效的。它不会编辑存储在
A
中的版本,该版本符合您的要求;myComplexClass.getSomething()?您可能不应该首先添加getter。为什么外部实体需要访问成员1。这是唯一的实体吗?如果是这样,就把它当作朋友吧。
ComplexClass myComplexClass=a.getMember1()有什么问题;myComplexClass.getSomething()?您可能不应该首先添加getter。为什么外部实体需要访问成员1。这是唯一的实体吗?如果是这样的话,那就交个朋友吧。是的,那是个好办法,但这不是一个有效的选择。正如我所写的,我希望从member1访问数据,而不是对其执行工作。是的,这是一个好方法,但对这种情况来说,这不是一个有效的选项。正如我所写的,我希望从member1访问数据,而不是在其上实现工作。