hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 429|回复: 5

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

[复制链接]

585

主题

769

帖子

2007

积分

大司空

Rank: 5Rank: 5

积分
2007
发表于 2023-9-25 12:37:18 | 显示全部楼层 |阅读模式
我有一个 C++ 类 CBiVector,用来处理二维向量相关问题。

下面是简化的代码:
  1. 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  之类的技术?
回复

使用道具 举报

0

主题

195

帖子

166

积分

关内侯

Rank: 2

积分
166
发表于 2023-9-25 12:37:50 | 显示全部楼层
竟然悄悄的用到了委托构造,我觉得这个已经可以了,

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

2

主题

181

帖子

41

积分

新手上路

Rank: 1

积分
41
发表于 2023-9-25 12:38:45 | 显示全部楼层
我的初衷是,可以优雅地声明一个只读对象,但希望其中的枚举变量在编译期即可完成使命(以达高效),而非等到运行期才读取和计算:
  1. 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(); // 一句话掰成两句,太难看了!
复制代码
回复

使用道具 举报

0

主题

180

帖子

37

积分

新手上路

Rank: 1

积分
37
发表于 2023-9-25 12:39:13 | 显示全部楼层
不能直接上复数吗?
乘正负i很方便的
回复

使用道具 举报

0

主题

179

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-25 12:39:50 | 显示全部楼层
楼上提到了“复数”,我仔细揣摩了一下,不符合所需。

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

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

使用道具 举报

0

主题

185

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-25 12:40:40 | 显示全部楼层
类似的需求,我希望能显式而高效的定义一个只读对象,它是源自两个向量的 和/差,而后顺/逆时针90°旋转,如何操作?
要求:高效、易读(优雅)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-11-22 21:36 , Processed in 0.071398 second(s), 23 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

快速回复 返回顶部 返回列表