乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 79|回复: 5

std::unique_ptr 用于 DB 对象...或坏主意

[复制链接]

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2018-10-21 00:09:55 | 显示全部楼层 |阅读模式
数据库对象的std::unique_ptr...还是馊主意lol    模板。
类DBObjectDeleter。
{。
公共:。
内联void运算符()(T *p)。
{。
if (p!= nullptr)。
return this-> close(p);。
}。
私人:。
内嵌无效关闭(T *p)。
{。
如果(!p->objectId(),isNull())。
p-> close();。
否则。
this-> deleter(p);。
}。
内嵌void删除程序(T *p)。
{。
删除p;。
p = nullptr。
}。
};。

模板。
使用unique _ dbo _ ptr = STD::unique _ ptr;。

typedef unique _ dbo _ ptr。
        void quaz()。
{。
AcDbLineUPtr pLine(new AcDbLine());。
//...。
}。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2018-10-21 00:26:42 | 显示全部楼层
沿着相同的思路typedef std::unique_ptr AcDbDictionaryIteratorPtr;。
typedef std::unique_ptr AcDbBlockTableIteratorPtr;。
typedef std::unique_ptr AcDbBlockTableRecordIteratorPtr;。

inline AcDbBlockTableIteratorPtr createBlockTableIterator。
(。
const AcDbBlockTable* pSrc,。
Acad::ErrorStatus *stat = nullptr,。
布尔在开始 = 真,。
布尔跳过删除 = 真。
)。
{。
Acad::ErrorStatus _stat = eOk;。
AcDbBlockTableIterator *pIter = nullptr;。
if (pSrc != nullptr)。
_stat = pSrc->newIterator(pIter, atBeginning, skipDeleted);。
if (stat != nullptr)。
*统计 = _stat;。
return AcDbBlockTableIteratorPtr(pIter);。
}。

inline AcDbBlockTableRecordIteratorPtr createBlockTableRecordIterator。
(。
const AcDbBlockTableRecord* pSrc,。
Acad::ErrorStatus *stat = nullptr,。
布尔在开始 = 真,。
布尔跳过删除 = 真。
)。
{。
Acad::ErrorStatus _stat = eOk;。
AcDbBlockTableRecordIterator *pIter = nullptr;。
if (pSrc != nullptr)。
_stat = pSrc->newIterator(pIter, atBeginning, skipDeleted);。
if (stat != nullptr)。
*统计 = _stat;。
return AcDbBlockTableRecordIteratorPtr(pIter);。
}。
  static void foo(void)。
{。
AcDbObjectId rid, id;。
AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();。
AcDbBlockTablePointer pBT(pDb->blockTableId());。
AcDbBlockTableIteratorPtr pBTIter = createBlockTableIterator(pBT);。
for (pBTIter->start(); !pBTIter->done(); pBTIter->step())。
{。
if (pBTIter->getRecordId(rid) == eOk)。
{。
AcDbBlockTableRecordPointer record(rid);。
AcDbBlockTableRecordIteratorPtr piter = createBlockTableRecordIterator(record);。
for (piter->start(); !piter->done(); piter->step())。
{。
if (piter->getEntityId(id) == eOk)。
{。
AcDbEntityPointer pEnt(id);。
//...亚达 亚达 。
}。
}。
}。
}。
}。

回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2019-5-24 19:08:55 | 显示全部楼层
仍然在复习我的C++但是当我第一次读到新的智能指针时,这是我第一次想到使用它们(即在某些ObjectARX中)。
我想这取决于你的函数的大小以及你必须管理多少个“新”指针,然后它们会在许多函数中被大量使用,所以我认为是的,好主意
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2019-5-25 00:18:23 | 显示全部楼层
我一直在使用AcDbObjectPointer为dbobject和std::unique_ptr迭代器(和其他一切)//。
模板。
const自动记录=[]。
{。
迭代器类型*pIter=nullptr;。
Acad::Errorstatus es=record.newIterator(pIter);。
返回std::make_tuple(es, std::unique_ptr(pIter));。
};。
=makeIterator;。
=makeIterator;。


//。
如果(AcDbBlockTablePointer pBt(block TableId,AcDb::kForRead);pBt.openStatus () == eOk)。
{。
如果(自动[es, btTter]=makeBlockTableIterator(*pBt); es==eOk)。
{。
for(btTter->start();!btTter->完成();btTter->步骤())。
{。
...。
}。
}。
}。
而我一直路过refrence。
空虚呜呜(AcDbObjectId id)。
{。
如果(AcDbObjectPointerpLine(id);pLine.openStatus () == eOk)。
{。
雅虎(*pLine);。
}。
}。

Acad::Errorstatus yahoo(AcDbLine&line)。
{。
AcString层;。
返回line.layer(层);。
}。

回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2019-5-25 00:19:40 | 显示全部楼层
当然,这可能会在几周内改变
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2019-5-25 00:23:41 | 显示全部楼层
脚趾
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 09:35 , Processed in 0.330127 second(s), 64 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表