Разработка samsung bada без использования указателей

Объекты в 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 ответа

Решение

В этом коде:

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

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

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

Другие вопросы по тегам