【发布时间】:2022-01-12 18:06:43
【问题描述】:
我想从公共类函数返回一个结构的副本,我在这个类中定义这个结构作为一个私有成员。
是否可以返回任何其他类型的自定义数据的这种结构?
考虑这个简单的例子:
class Test {
private:
struct sTest {
int i = 1;
}_sTest;
public:
sTest GetStruct() {
return _sTest;
}
};
然后在我创建这个类的对象之后:
Test cTest;
我怎么打电话
cTest.GetStruct()
得到
_sTest
?
【问题讨论】:
-
问题是调用GetStruct()的用户无权访问私有成员,也不知道结构的实现。
-
如果名称
sTest是私有的,您如何期望调用代码现在知道如何处理GetStruct返回的sTest?从技术上讲,您可以执行auto something = sTest.GetStruct();之类的操作,因为只有 namesTest是私有的 (demo here),但是……您为什么要这样做?如果sTest应该对调用代码有意义,请将其作为类的公共接口的一部分。 -
如果我将 sTest 公开,那么它将不会被封装。我要做的就是读取存储在类内部私有结构中的数据。有更好的方法吗?
-
我也有从 cTest 派生的子类,它们重载 GetStruct() 并有自己的 sTest 结构实现,所以我需要为每个子类设置 sTest 唯一
-
如果您在公共函数中返回
sTest并且您希望调用代码能够直接在sTest上操作,那么您已经没有“封装”任何东西,因为这些实现细节需要知道。或许找出存储在sTest中的特定数据需要向该类的用户公开并编写返回该数据的函数?