разработка samsung bada без использования указателей - PullRequest
3 голосов
/ 20 сентября 2011

Объекты в C ++ могут быть созданы с использованием методов, перечисленных ниже (о которых я знаю):

Person p;

или

Person p("foobar");

или

Person * p = new Person();

Тогда почему Samsung 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 создает объект на лету без указателя.Чем он отличается от лейбла тогда?Это сбивает с толку: - /

Ответы [ 3 ]

4 голосов
/ 20 сентября 2011

В этом коде:

// 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 выходит из области видимости.

2 голосов
/ 29 сентября 2011

Обратите внимание, что В документации 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;

}

После такого кодированияруководящие принципы гарантируют, что ваше приложение сможет обострить любые проблемы при инициализации пользовательского интерфейса, за исключением случаев, когда проблема возникает при выполнении OnAppInitializing.

0 голосов
/ 20 сентября 2011

Посетитель прибил его в своем комментарии; Bada использует технику C ++, впервые разработанную Symbian в середине девяностых. Они совершенно устарели сегодня. Не принимайте это всерьез, вы не можете ожидать, что Samsung выставит своих высокопоставленных людей на такой обреченный проект. Те будут работать на их линии Android.

...