不使用指针开发三星Bada系统

3

在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
1
@Mankarse,这只是普通的C++指针代码,没有什么不好的;不好的事情可能是滥用它或者没有delete已分配的内存。 - Griwes
2
@Mankarse:bada完全禁止异常。它更喜欢两阶段构造,这与RAII的直接相反。它更喜欢一个非抛出构造函数(例如,在构造函数中没有new)后跟一个Construct调用。原因是bada(和Symbian)是为资源有限的设备设计的,添加异常处理被认为是太大的开销。IDE可能会提供帮助,但我不知道为什么它会引起OP的问题-也许查看构造函数可能会有所帮助? - Skizz
1
@Skizz,Bada使用新操作符后跟构造函数调用。请参见上面的代码。代码来自Bada API参考 - yogiam
感谢大家的回复。Skizz和david的回答都非常准确地解答了我的问题。虽然我不能同时接受这两个答案,但我同意它们的观点 :) - yogiam
显示剩余5条评论
3个回答

4
在这段代码中:
// Create a Label
Label pLabel;
pLabel.Construct(Rectangle(50, 200, 150, 40), L"Text");
pLabel.SetBackgroundColor(Color::COLOR_BLUE);
AddControl(pLabel);
Label *pLabel = new Label();

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


在Construct调用中使用的Rectangle类怎么样?为什么框架会维护它的引用 :-/ - yogiam
@yogiam:矩形数据可能是通过Control::SetBounds方法按值复制到标签控件中的。我不知道API的内部工作原理,因此它可能会执行其他操作。重要的是,在矩形被销毁之前存储数据。 - Skizz
1
Skizz,你忽视了最棘手的解析! Label pLabel() 声明了一个函数!这段代码完全与你所说的不同。 - Konrad Rudolph
@Konrad:很好的发现。我只是从问题中复制粘贴,但是OP说代码编译和运行都没问题,所以这一定是OP的打字错误。 - Skizz

2
请注意,Bada文档指出:

所有容器和控件必须在设备堆内存上创建。当应用程序终止时,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时。


谢谢链接,David。我一直在寻找那个能够清晰解释bada内存管理的1行文档 :) - yogiam

0

在评论中访问者说得好;Bada使用的是20世纪90年代由塞班开创的C++技术。这些技术今天已经过时了。不要太认真,你不能真正指望三星将他们顶级人才放在这样一个注定失败的项目上。这些人将在他们的安卓产品线上工作。


我不确定Bada注定要失败。在Google收购摩托罗拉之后,HTC正在考虑购买移动操作系统,如果三星开始更多地投资Bada,我也不会感到惊讶。 - piokuc
@piokuc:分叉Android仍然比从头开始更有意义。Symbian通过从高端开始,随着优秀的替代品超越诺基亚而向低端迁移,在十年间取得了成功。Bada从低端开始,就像Symbian现在一样,它们都有相同的未来。 - MSalters
我认为你所定义的低端是有争议的。诚然,我偶然发现了低端的S575,但幸运的是它相当不起眼。在英国,Wave手机悄无声息地出现,然后又消失了,目前你可以在Wave II中以100英镑的价格获得整个手机(类似于iPhone级别的硬件)。它的操作系统很像iPhone,只需要一个制造商进行开发就可以更容易地实现。他们现在只需要苹果的营销团队了。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接