Выполнение кода в функции после обращения к оператору возврата в c ++ - PullRequest
0 голосов
/ 06 января 2012

У меня есть следующая функция:

Class Image {

    IplImage* createImage( char* name )
    {
        IplImage* img = cvLoadImage( name );

        return img;

        ...
    }
}

int main() {
    IplImage* newimg = createImage( "somepath" );
    return 0;
}

После того, как была выполнена функция createImage , я хотел бы знать, есть ли способ выполнить некоторый код после обращения к оператору return и заполнения newimg с помощью содержимое переменной img .

Приведенный выше код является примером того, чего я хочу достичь. Мой главный вопрос: есть ли способ выполнить код в функции даже после того, как был достигнут оператор return?

Ответы [ 6 ]

5 голосов
/ 06 января 2012

НЕТ! Инструкция return делает именно это, она немедленно возвращается.Что бы ни было после того, как оно не будет выполнено.

Поэтому, если вы хотите, чтобы эта функция еще что-то выполняла, вы должны добавить код для этих задач перед функцией return:

IplImage* createImage( char* name )
{
    IplImage* img = cvLoadImage( name );

    // test if image was loaded and/or
    // do whatever else you feel you need to do
    // before:

    return img;
}

Помните, ваша функция createImage() должна быть простой и работать так, как рекламируется: создать изображение.

3 голосов
/ 06 января 2012

Да, вы можете создать локальный объект, который будет выполнять код во время его деструктора.Вот пример:

class X
{
    X(){}

    ~X()
    {
        std::cout << "hello" << std::endl;
    }
};

int a_function()
{
    X x;

    int a = some_calculation();
    return a;
}

Этот метод, например, используется с указателями области видимости.

1 голос
/ 06 января 2012

Это то, что вы должны делать.

Class Image {

    IplImage* createImage( char* name )
    {
        IplImage* img = cvLoadImage( name );
        return img;
    }
}
void doMoreStuff(){
        ...
}
int main() {
    IplImage* newimg = createImage( "somepath" );
    doMoreStuff();
    return 0;
}
1 голос
/ 06 января 2012

Чтобы ответить на вопрос, нет невозможно выполнить код после инициализации newimg (по крайней мере, не в функции createImage). Это самое близкое, что вы можете получить:

struct post_return_guard{
  ~post_return_guard(){
     // whatever you want HERE
  }
};

IplImage* createImage(std::string const& name){
  post_return_guard g;
  IplImage* img = cvLoadImage(name.c_str());
  return img;
  // destructor of 'g' called, code executed.
}
1 голос
/ 06 января 2012

Каждый битный код после (безусловного) оператора возврата любой функции / метода в C / C ++ является недостижимым кодом и никогда не будет доступен / запущен!

0 голосов
/ 06 января 2012

Это не сложно; просто вернуть прокси-объект (а не указатель) который выполняет код в своем деструкторе. Так как вы ожидаете указатель в свою очередь, прокси-объект должен также неявно преобразовываться в указатель.

Сказав это, однако: почему вы? Что ты пытаешься сделать что не может быть сделано в createImage, между моментом звонка cvLoadImage а в тот момент, когда вы вернетесь?

...