gxqcn 发表于 2019-11-11 14:15:54

如何改写构造函数,使之优雅而高效?

我有一个 C++ 类 CBiVector,用来处理二维向量相关问题。

下面是简化的代码:enum class rotate
{
    CW,
    CCW,
};

class CBiVector
{
public:
    explicit CBiVector( const double& x, const double& y ) : m_x{ x }, m_x{ y }{};
    explicit CBiVector( const CBiVector& V ) : CBiVector{ V.m_x, V.m_y }{};
    explicit CBiVector( const CBiVector& V, rotate eRotate ) : CBiVector{ V }
    {
      rotate::CCW == eRotate ? ccw() : cw();
    };

    // ...

    CBiVector& ccw( void )
    {
      const auto t{ m_x };

      m_x = -m_y;
      m_y =t;

      return *this;
    }

    CBiVector& cw( void )
    {
      const auto t{ m_x };

      m_x =m_y;
      m_y = -t;

      return *this;
    }

    // ...

private:
    double      m_x;
    double      m_y;
}

我现在对第三个构造函数不满意,
它的本意是:构造一个新向量,源于对一个已知向量的顺时针/逆时针90°旋转,
不满意的地方在于,内部有一个 bool 表达式需运行时计算,
可否有消除之道?比如用 模板、constexpr if之类的技术?

wayne 发表于 2019-11-11 15:59:24

竟然悄悄的用到了委托构造,我觉得这个已经可以了, :lol

应该将这个问题 划入 到类的设计模式层面去考虑. 比如考虑另外建立一个 transform 类, 专门负责 向量的各种旋转,平移,剪切 变换,然后向量本身只是作为一种静态的数据实体 entity存在. [好处是逻辑与数据的解耦, 从而保持构造函数的纯粹性,就是只干内存分配这一件事情]

gxqcn 发表于 2019-11-11 16:27:12

我的初衷是,可以优雅地声明一个只读对象,但希望其中的枚举变量在编译期即可完成使命(以达高效),而非等到运行期才读取和计算:
const CBiVector V{ 0, 1 };

// 可以直接定义一个常量对象
const CBiVector V_ccw{ V, rotate::CCW };

// 而不是如同这样的:
// const CBiVector V_ccw{ CBiVector{ V }.ccw() };
// 或者:
// CBiVector V_ccw{ V };
// V_ccw.ccw(); // 一句话掰成两句,太难看了!

.·.·. 发表于 2019-11-11 20:44:02

不能直接上复数吗?
乘正负i很方便的

gxqcn 发表于 2019-11-12 07:28:18

楼上提到了“复数”,我仔细揣摩了一下,不符合所需。

1、效率方面:旋转功能,我仅需要顺时针/逆时针90°,只需 取反、赋值 操作即可;用复数则还需用到 乘法 操作;

2、功能方面:我需要用到向量的叉乘和点乘,以便快速得到两个向量之间,有向夹角的正余弦;而复数没有对应的叉乘、点乘概念。

gxqcn 发表于 2019-11-12 08:04:46

类似的需求,我希望能显式而高效的定义一个只读对象,它是源自两个向量的 和/差,而后顺/逆时针90°旋转,如何操作?
要求:高效、易读(优雅)
页: [1]
查看完整版本: 如何改写构造函数,使之优雅而高效?