在c ++中是否存在类似于客观c属性的模拟

时间:2011-11-21 13:20:52

标签: c++ objective-c

如何从目标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;

以及如何正确翻译第一和第二个属性???

3 个答案:

答案 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