如何从目标c
转换为非托管c ++ 1)property ( nonatomic, assign, getter = isCanceled ) BOOL canceled;
顺便说一句 - isCanceled = false;
所以为什么不对'属性(非原子,赋值)BOOL取消;
与其他运营商的代码的另一部分一样:
2)property ( nonatomic, retain ) Im* img;
这个结构在c ++中是不变的吗?
3)property ( nonatomic, readonly ) Parameter* firstPar;
所以这在c ++中就像变量const Parameter* firstPar;
?
以及如何正确翻译第一和第二个属性???
答案 0 :(得分:3)
我在Objective C中没有很多经验,但据我所知,翻译将遵循:
// property ( nonatomic, assign, getter = isCanceled ) BOOL canceled
private:
bool canceled; // inner backing field
public:
bool isCanceled() const // getter has a special name
{
return canceled;
}
void setCanceled(bool newCanceled) // standard setter
{
canceled = newCanceled;
}
对于带retain的指针属性,最好使用共享指针。但是,外部代码必须遵循其语义。
// property ( nonatomic, retain ) Im* img;
private:
// we could use manual retain/release with some kind of shared pointers,
// but an easier way would be to use automatic refcounting
std::shared_ptr<Im*> img; // shared_ptr because retain
public:
Im* getImg() // getter
{
return img.get();
}
void setImg(Im* newImg) // setter
{
img.reset(newImg);
}
第三是最简单的。不需要共享指针,因为没有涉及retain
。
// property ( nonatomic, readonly ) Parameter* firstPar;
private:
Parameter* firstPar;
public:
Parameter* getFirstPar()
{
return firstPar;
}
// no setter because readonly
等
C ++没有字段的概念,所以你必须通过手动创建getter和setter来模拟它们。
编辑:
感谢评论中的讨论,我通过删除互斥锁后卫纠正了答案。如果有atomic
,则需要它。
使用atomic
,您需要一个额外的互斥锁:
// property ( atomic, assign, getter = isCanceled ) BOOL canceled
private:
bool canceled; // inner backing field
std::mutex canceledGuard; // ensure atomicity
public:
bool isCanceled() const // getter
{
std::lock_guard<std::mutex> lock(canceledGuard);
return canceled;
}
void setCanceled(bool newCanceled) // setter
{
std::lock_guard<std::mutex> lock(canceledGuard);
canceled = newCanceled;
}
答案 1 :(得分:1)
你可以使用一个实例变量并提供setter / getter方法,这些方法在C ++中必须手工构建:
class MyClass
{
private:
bool m_cancelled;
public:
...
void setCancelled(bool cancelled)
{
m_cancelled = cancelled;
}
bool isCancelled() const
{
return m_cancelled;
}
};
答案 2 :(得分:0)
C ++中常见的习惯用法是使用函数重载来赋予setter和getter相同的名称:
class Sample {
public:
void Cancelled(bool cancelled) { this->cancelled = cancelled; }
bool Cancelled() const { return cancelled; }
private:
bool cancelled;
};
Sample x;
x.Cancelled(true);
bool c = x.Cancelled();
有很多方法可以使用模板在C ++中模拟实际的属性语法。可以找到这种技术的一个很好的例子here。