【问题标题】:samsung bada development without using pointers三星bada开发不使用指针
【发布时间】:2011-09-20 08:07:23
【问题描述】:

可以使用下面列出的方法(我知道)创建 C++ 中的对象:

Person p;

Person p("foobar");

Person * p = new Person();

那么,为什么三星 Bada IDE 不允许我执行前两种方法?为什么我总是必须使用指针?我可以使用指针等等,只是我想知道样式背后的根本原因。

来自 Bada API 参考的示例代码。

// Create a Label
Label *pLabel = new Label();
pLabel->Construct(Rectangle(50, 200, 150, 40), L"Text");
pLabel->SetBackgroundColor(Color::COLOR_BLUE);
AddControl(*pLabel);

我修改并尝试使用下面的代码。虽然它编译并且应用程序运行,但标签不会显示在表单上。

// Create a Label
Label pLabel();
pLabel.Construct(Rectangle(50, 200, 150, 40), L"Text");
pLabel.SetBackgroundColor(Color::COLOR_BLUE);
AddControl(pLabel);

注意:使用的 Rectangle 类在没有指针的情况下动态创建对象。那么它与Label有什么不同呢?它令人困惑:-/

【问题讨论】:

  • 我不知道你的问题的答案,但Person *p = new Person()真的糟糕的代码(一般)。在这种情况下,p 应该是某种智能指针,可以获取新分配的Person 的所有权。
  • 你能详细说明为什么它不好吗?否则应该如何(好)?
  • @Mankarse,这只是普通的 c++ 指针代码,还不错;坏事可能是滥用或不deleteing 分配的内存。
  • @Mankarse:bada 完全禁止异常。它更喜欢两相结构,与 RAII 正好相反。它更喜欢非抛出构造函数(例如,构造函数中没有 new),然后是 Construct 调用。原因是 bada(和 Symbian)是为资源有限的设备设计的,添加异常处理被认为是过多的开销。 IDE 可能会为此提供帮助,但我不知道为什么它会导致 OPs 问题 - 也许查看构造函数可能会有所帮助?
  • @Skizz,Bada 确实使用了 new 运算符,然后是一个 Construct 调用。请看上面的代码。从Bada API reference复制的代码

标签: c++ pointers ide bada


【解决方案1】:

在这段代码中:

// Create a Label
Label pLabel;
pLabel.Construct(Rectangle(50, 200, 150, 40), L"Text");
pLabel.SetBackgroundColor(Color::COLOR_BLUE);
AddControl(pLabel);

标签对象在超出范围时被销毁,因此无法显示在表单上。不幸的是,AddControl 方法需要引用,因为这意味着上述方法应该有效。使用:

Label *pLabel = new Label();

因为当pLabel 变量超出范围时,默认情况下不会调用析构函数。

【讨论】:

  • Construct 调用中使用的 Rectangle 类呢?框架如何维护它的引用:-/
  • @yogiam:矩形数据可能是使用 Control::SetBounds 方法按值复制到 Label 控件中的。我对 API 的内部运作一无所知,所以它可能会做其他事情。重要的是数据是在 Rectangle 被销毁之前存储的。
  • Skizz,你忽略了最令人头疼的解析! Label pLabel() 声明了一个函数!这段代码做的事情和你说的完全不同。
  • @Konrad:好地方。我只是从问题中复制+粘贴,但 OP 说代码编译正常并运行,所以它一定是 OP 的打字错误。
【解决方案2】:

请注意Bada documentation 是这样说的

所有容器和控件都必须在设备堆内存上创建。当应用程序终止时,bada 平台会删除框架控件及其后代。此外,平台会释放已分配给应用程序的堆内存。

您的代码可能运行良好,因为它忽略了对 AddControl 的调用,因为它检测到控件未在堆空间中分配。在这种情况下,AddControl 应该返回一个错误代码。

要获得正确的 Bada 代码,需要编写如下代码:

result MySample::OnInitializing() {
  result r = E_SUCCESS;

  std::auto_ptr<Label> pLabel(new Label);
  if (pLabel.get() != null && E_SUCESS == pLabel->Construct(Rectangle(50, 200, 150, 40), L"Text"))
  {
     pLabel->SetBackgroundColor(Color::COLOR_BLUE);
     r = AddControl(*pLabel);
     pLabel.release();
  }
  else
  {
    r = E_FAILURE;
  }
  return r;

}

遵循此类编码指南可确保您的应用程序能够在初始化 UI 时上报任何问题,除非问题发生在执行 OnAppInitializing 时。

【讨论】:

  • 感谢大卫的链接。我一直在寻找 1 行文档,它清除了 bada 中的内存管理方式:)
【解决方案3】:

访客在他的评论中指出了这一点; Bada 使用了 Symbian 在九十年代中期首创的 C++ 技术。他们今天完全过时了。不要太认真,你不能真的指望三星会把他们的顶级人才投入到这样一个注定失败的项目上。这些将在他们的 Android 产品线上工作。

【讨论】:

  • 我不太确定 Bada 注定要失败。在谷歌收购摩托罗拉之后,HTC 正在嘀咕购买移动操作系统,如果三星开始在 Bada 上投入更多资金,我不会感到惊讶。
  • @piokuc:分叉 Android 仍然比从头开始更有意义。十年来,Symbian 一直是成功的,它从高端市场起步,随着其他替代产品超过诺基亚而向下迁移到低端市场。 Bada起步是低端市场,Symbian 现在所处的位置,他们都拥有相同的未来。
  • 我会争论你定义为低端的东西。不可否认,我偶然发现了低端 S575,但幸运的是它相当晦涩难懂。在英国,Wave 悄然出现,然后又消失了,现在你可以在 Wave II 中以 100 英镑的价格买到很多手机(比如 iPhone 级别的硬件)。它很像 iPhone 的操作系统,一个制造商为其开发更容易。他们现在只需要 Apple 营销团队。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 2011-12-05
  • 2011-05-29
相关资源
最近更新 更多