Простой вызов функции в потоке - PullRequest
0 голосов
/ 23 ноября 2018
class base 
{ 
public: 
    virtual void fun_1() { cout << "base-1\n"; } 
    virtual void fun_2() { cout << "base-2\n"; } 

}; 

class derived : public base 
{ 
public: 
    void fun_1() { cout << "derived-1\n"; } 
    void fun_2() { cout << "derived-2\n"; 
    } 
}; 


class caller
{
    private:
        derived d;
        unique_ptr<base> b = make_unique<derived>(d);

    public:
        void me()
        {
            b->fun_2(); //? How to do this in thread
            // std::thread t(std::bind(&base::fun_2, b), this);
            // t.join();
        }
};

int main() 
{  
    caller c;    
    c.me();
    return 0;
}

Я написал небольшую программу для совместного изучения умного указателя и виртуальной функции.Теперь я застрял, как я мог бы вызвать b-> fun_2 () в потоке, я не могу изменить базовый и производный класс.Я также должен использовать unique_ptr и не могу перейти на shared_ptr.Также, пожалуйста, объясните сообщение об ошибке, когда вы, если возможно, раскомментируете строку, которую я прокомментировал.

1 Ответ

0 голосов
/ 23 ноября 2018

Просто сделайте это следующим образом:

void me()
{
    std::thread t(&base::fun_2, std::move(b));
    t.join();
}

Ваше сообщение об ошибке связано с попыткой создать копию unique_ptr, которая не разрешена.Если вам действительно нужен этот тип вызова (с bind ), используйте его следующим образом:

std::thread t(std::bind(&base::fun_2, std::ref(b)));

или

std::thread t(std::bind(&base::fun_2, b.get()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...