Вы можете сделать следующее с помощью Swift 2.2:
let alertController: UIAlertController = ...
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(alertController, animated: true, completion: nil)
и Swift 3.0:
let alertController: UIAlertController = ...
UIApplication.shared.keyWindow?.rootViewController?.present(alertController, animated: true, completion: nil)
Вы не можете вернуть ссылку на временный объект в стеке. У вас есть три варианта:
Обратите внимание, что при возврате по значению, как в приведенном ниже коде, компилятор должен оптимизировать присвоение, чтобы избежать копирования, т.е. он просто создаст один прямоугольник ( rect) путем оптимизации создания + назначения + копирования в файл создания. Это работает только тогда, когда вы создаете новый объект при возврате из функции.
Rectangle GetRect( void ) const
{
return Rectangle( x, y, w, h );
}
Rectangle rect = theBox.GetRect();
No you cannot do this. Essentially what you're trying to do in this sample is return a reference to a temporary variable on the stack. By the time the reference is returned, the variable it's pointing to will be destroyed and hence the reference is invalid.
Есть ли правильный способ вернуть новый экземпляр объекта по ссылке в C ++?
Нет, не по ссылке. Есть два способа создать новый объект:
В стеке:
Rectangle makeRect()
{
return Rectangle(x, y, w, h);
}
Rectangle r = makeRect(); // return by value
В куче:
Rectangle * makeRect()
{
return new Rectangle(x, y, w, y);
}
Rectangle * r = makeRect(); // returned a pointer, don't forget to delete it later
Почему не что-то вроде этого?
class Box
{
private:
Rectangle mRectangle;
public:
Box(float x, float y, float w, float h) :
mRectangle(x, y, w, h) // Forgive me for making assumptions
// about the inner workings of your
// code here.
{
}
const Rectangle & GetRect() const
{
return mRectangle;
}
};
Rectangle rect = theBox.GetRect();
«Назначение» теперь должно работать. (Технически это не оператор присваивания, а вызываемый конструктор копирования.)
Надеемся на помощь
Возврат объекта по значению (см. Пример ниже) может быть дешевле, чем вы думаете. Компилятор часто оптимизирует лишнюю копию. Это называется оптимизацией возвращаемого значения .
Rectangle GetRect( void ) const
{
return Rectangle( x, y, w, h );
}
Это невозможно. Ссылка - это еще одна форма указателя, и вы фактически возвращаете адрес объекта, который будет уничтожен (вызван деструктор) и, возможно, даже перезаписан к тому времени, когда вызывающий объект получит управление.
Вы можете либо
Возможно, вас сбивает с толку концепция времени жизни временного. Подумайте:
void f1( const A & a ) {
}
A f2() {
return A;
}
f1( f2() );
Это нормальный код, и стандарт говорит, что безымянный временный объект, который создает f2, должен висеть достаточно долго, чтобы его можно было использовать в f1.
Однако ваш случай несколько иной. Вещь, которую возвращает ваша функция, является ссылкой, и поэтому безымянный временный объект также является ссылкой. Эта ссылка должна висеть достаточно долго, чтобы быть полезной, но то, к чему она относится.
Если прямоугольник побитово выглядит как Box, т.е. состоит из четырех чисел с плавающей запятой (но имеет разные функции-члены), вы можете использовать reinterpret_cast , хотя я бы не рекомендовал его :
const Rectangle & GetRect( void ) const
{
assert(sizeof(Rectangle) == sizeof(Box));
return reinterpret_cast <Rectangle> (*this);
}
Box
(иметь член Rectangle
. Возвращение ссылки const
] рекомендуется). Rectangle
. Обратите внимание, что использование идиомы return SomeClass (a, b, c);
, вероятно, вызовет оптимизацию возвращаемого значения (RVO) на достойном компиляторе. Проверьте свой std :: сложная реализация
для подробностей.
мы можем использовать auto_ptr, если мы хотим использовать новый и безопасный от утечки памяти
class Box {
private: float x, y, w, h;
public:
//...
std::auto_ptr<Rectangle> GetRect( void ) const
{
return std::auto_ptr<Rectangle> ( new Rectangle( x, y, w, h ));
}
};