C :儿童隐藏方法

C++: hide method from children

本文关键字:隐藏 方法      更新时间:2023-10-16

我有一个称为 transform的类,其子类translationrotationscaling应该在三角形上应用转换。

每个子类都覆盖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的类所要求的标题文件中。

我建议更改视图的方式变换。

  1. 使transform成为一个类,因此它不需要从中得出其他类。转换一个点所需的所有数据都可以保存在此类中。

  2. 添加构建缩放变换,翻译变换和旋转变换的函数。

  3. 添加函数以乘以变换,并乘以转换和一个点。这些可以是转换其他形状的基础。

  4. 添加用于根据需要转换其他形状的功能。


以骨骼形式,

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的子类包含它。