如何改写构造函数,使之优雅而高效?
我有一个 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之类的技术? 竟然悄悄的用到了委托构造,我觉得这个已经可以了, :lol
应该将这个问题 划入 到类的设计模式层面去考虑. 比如考虑另外建立一个 transform 类, 专门负责 向量的各种旋转,平移,剪切 变换,然后向量本身只是作为一种静态的数据实体 entity存在. [好处是逻辑与数据的解耦, 从而保持构造函数的纯粹性,就是只干内存分配这一件事情] 我的初衷是,可以优雅地声明一个只读对象,但希望其中的枚举变量在编译期即可完成使命(以达高效),而非等到运行期才读取和计算:
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(); // 一句话掰成两句,太难看了! 不能直接上复数吗?
乘正负i很方便的 楼上提到了“复数”,我仔细揣摩了一下,不符合所需。
1、效率方面:旋转功能,我仅需要顺时针/逆时针90°,只需 取反、赋值 操作即可;用复数则还需用到 乘法 操作;
2、功能方面:我需要用到向量的叉乘和点乘,以便快速得到两个向量之间,有向夹角的正余弦;而复数没有对应的叉乘、点乘概念。 类似的需求,我希望能显式而高效的定义一个只读对象,它是源自两个向量的 和/差,而后顺/逆时针90°旋转,如何操作?
要求:高效、易读(优雅)
页:
[1]