C :儿童隐藏方法
C++: hide method from children
我有一个称为 transform
的类,其子类translation
,rotation
和scaling
应该在三角形上应用转换。
每个子类都覆盖apply_transform()
方法:
class transform
{
protected:
virtual triangle apply_transform(const triangle&) const = 0;
public:
static triangle apply_transforms(const triangle&, const std::initializer_list<const transform*>&);
};
class scaling : public transform
{
...
public:
triangle apply_transform(const triangle&) const override;
};
//same for rotation and translation
i还具有称为apply_transforms
的函数,外界应该可以访问该功能,我使用它应用多个转换。我将其传递给transform*
的列表以启用多态性。
我唯一的问题是,现在,儿童课也知道这种方法。这困扰着我,因为儿童课程不应该应用所有其他转型。
有一个优雅的解决方案吗?
使apply_transforms
一个非成员函数,该功能未包含在实现transform
的类所要求的标题文件中。
我建议更改视图的方式变换。
-
使
transform
成为一个类,因此它不需要从中得出其他类。转换一个点所需的所有数据都可以保存在此类中。 -
添加构建缩放变换,翻译变换和旋转变换的函数。
-
添加函数以乘以变换,并乘以转换和一个点。这些可以是转换其他形状的基础。
-
添加用于根据需要转换其他形状的功能。
以骨骼形式,
class transform { ... };
class position { ... };
// tag structs
struct rotation_about_x {};
struct rotation_about_y {};
struct rotation_about_z {};
// Functions to construct transforms
transform construct_scale_transform(double scale_factor) { ... };
transform construct_translation_transform(position pos) { ... };
transform construct_rotation_transform(double angle, rotation_about_x tag) { ... };
transform construct_rotation_transform(double angle, rotation_about_y tag) { ... };
transform construct_rotation_transform(double angle, rotation_about_z tag) { ... };
// Function to transform a point.
position operator*(transform const& t, position const& p) { ... }
// Function to multiply transforms.
transform operator*(transform const& t1, transform const& t2) { ... }
// Functions to apply transforms to other objects.
triangle operator*(transform const& tr, triangle const& t) { ... }
...
用法:
transform t1 = construct_rotation_transform(10, rotation_about_x{});
transform t2 = construct_translation_transform({20, 10, 0});
position p1{100, 200, 30};
position p2 = t1*t2*p1;
triangle tr1{ ... }
triangle tr2 = t1*t2*tr1;
如果要多次使用相同的组合变换,请首先计算组合的转换并将其用于所有转换。
transform t1 = construct_rotation_transform(10, rotation_about_x{});
transform t2 = construct_rotation_transform(5, rotation_about_y{});
transform t3 = construct_translation_transform({20, 10, 0});
tranform tc = t1 * t2 * t3;
position p1{100, 200, 30};
position p2 = tc*p1;
triangle tr1{ ... }
triangle tr2 = tc*tr1;
事实是,由于您的apply_transforms(...)
方法是公开的,因此所有潜在的呼叫者都可以使用。考虑到这一点,您不能,也不能阻止儿童课能够看到这些方法。
如果您知道您的方法将从特定的类中调用,则可以将您的方法私有化并将这些呼叫类声明为朋友。
否则,将方法封装在不同类中,以防止transform
的子类包含它。
相关文章:
- 在 cpp 文件中隐藏采用模板参数引用的方法
- Qt中的包装连接方法隐藏了编译器所需的信息
- 从基调用派生类的隐藏(非虚拟)方法
- 这种获取模板参数包中最后一个元素的方法是否有隐藏的开销?
- 调用虚函数的逻辑不清楚(或者是方法隐藏?
- 防止意外隐藏(CRTP mixin提供的方法)
- 是否有任何简单的方法(黑客)揭露前向声明隐藏的标头
- 在班上隐藏私人会员的最佳方法
- C :儿童隐藏方法
- C 中的向上,降低和隐藏方法
- 隐藏方法的实例返回到呼叫者
- g++ - 虚拟方法在生成的二进制中创建符号,我无法隐藏
- dll中的mingw隐藏方法名称
- 重写重载方法会隐藏一些重载
- 是否可以覆盖(隐藏)非虚拟方法,但仍然从子类显式调用它
- 在C++代码生成器中模拟 C#"new"(隐藏虚拟方法)
- 为什么在 Java 和 C++ 中不允许隐藏虚拟函数/方法?
- 有没有一种聪明的方法可以禁止通过派生类之一隐藏基类的运算符函数
- 调用Fl_Double_Window的隐藏方法在多线程 FLTK C++应用程序 (Visual Studio 2010
- 如何正确地隐藏方法