隐藏方法的实例返回到呼叫者
Hide methods of instance returned to caller
在对象A中有一系列的对象。类B类具有B1,B2,... B10
我希望对象A具有将指针返回到B类型对象的方法,但仅揭示方法B9-B10。呼叫者不应知道方法B1-B8
在将指针返回到类型B的对象时,如何隐藏方法B1-B8?我正在使用C
更新:
对象A需要访问B的所有方法,但是A将仅在A。
这似乎是代理模式的一个地方。ProxyB类只会暴露B9 -B10。
但是,我认为,如果方法B9和B10足够,那么它们会成为自己独特的界面。这两种方法应该是他们自己的类界面。如果B由BA组成B1 B1-B8和BB用方法B9-B10,则可以将指针返回到BB。
我能想到的一种方法是让另一个名为C
的类,其构造函数使用类B
的对象,仅提供方法B9
和B10
。
class C
{
private:
B B_object;
public:
C(B i_obj){
B_object = i_obj;
}
void B9_wrapper(){
B_object.B9();
}
void B10_wrapper(){
B_object.B10();
}
}
,然后您的A
方法返回指针(让我们命名 a_method
),必须将B
的对象转换为C
对象,然后将指针返回到后对象:
class A{
private:
B arr[10]; // array of objects of B
public:
void method_a(){
// let arr[3] be the object you want to return a pointer of
C result {arr[3]};
return &result;
}
希望对您有帮助。
您这里有很多不同的选项,我们应该使用代理模式,除其中一个外,还有所有的陷阱。
基类
在这里,我们有一个具有4个成员功能的理论,微不足道的空基类。我们想暴露其中2个。
class Base
{
public:
void b1() {};
void b2() {};
void b3() {};
void b4() {};
};
公共继承,隐藏方法
如果我们有很多希望公开的方法,但是只有一些我们希望隐藏的方法,则可能很容易使用公共继承,然后在派生类中隐藏一些方法。例如:
class Derived1: public Base
{
public:
char* x() { return x_; }
private:
using Base::b3;
using Base::b4;
char x_[2];
};
我建议不要这样做,因为它允许static_cast
到基类,这将使任何人都可以安全地将班级视为基类,从而有效地使派生的类a弱建议呈现。
私有继承,公开方法
这是我最喜欢的一堆,因为它可以防止static_cast
访问基类,并且会依靠隐式,reinterpret_cast
或C风格铸件尝试访问基类(仍然可以由标准保证,但是一个强大的建议)。
class Derived2: private Base
{
public:
using Base::b1;
using Base::b2;
char* x() { return x_; }
private:
char x_[2];
};
包装/适配器
这次尝试阻止了所有访问基类的机会,因此提供了最强的保证,但以增加班级规模的可能成本(仅当基类是空的):
:class Wrapper1
{
public:
void b1() { b_.b1(); }
void b2() { b_.b2(); }
char* x() { return x_; }
private:
Base b_;
char x_[2];
};
摘要
以上所有这些都有其优势,并且都有陷阱。我建议使用第二个或第三个选项,以包装现有类,并提出一个公共接口,该界面只能与所需的接口一起使用。
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- 将整数(文字)与函数相关联,让呼叫者查询拖鞋的数量
- 谷歌嘲笑!我的测试出错.默认情况下,呼叫将返回调用
- 如何专门针对size_t以外的返回类型来专业呼叫操作员
- 隐藏方法的实例返回到呼叫者
- C 功能内容基于呼叫者
- 如果send()返回x字节,则recv()在一个呼叫中获取相同数量的字节
- 为什么在空流上呼叫时,std :: istream ::忽略不返回
- 日志C 类方法呼叫者(功能名称,行号)
- 呼叫ClgetPlatFormids时,OpenCl返回-64
- Callee返回对象的范围W.R.T.呼叫者本地变量
- C 时间函数在不同的呼叫下返回相同的值
- 透明地将临时插入呼叫者的作用域
- 如何检查忍者并行构建的返回值
- C++ 偷看堆栈以获取呼叫者信息
- QDbus:服务呼叫返回 QList<int>
- 为什么来自 rvalued-stl-container 的元素获取者返回左值