Если вы не хотите передавать параметры в B (что было бы самым чистым решением), вы можете использовать локальное хранилище потока.
Хотя, глядя на ваш код в целом, вы, вероятно, будете стрелять себе в ногу, попробовав это строгое отображение 1-к-1 с Java на C ++.
В C ++ вы почти никогда не должны вызывать new
. Выделите в стеке, когда это возможно. new
в C ++ явно подвержен ошибкам (без сборки мусора), но он также чрезвычайно медленный по сравнению с управляемыми языками, такими как Java.
Функторы можно использовать в качестве более мощной альтернативы указателям на функции (например, при создании потока) или просто для замены общих функций exec()
или run()
. Вместо этого назовите их operator()
, и класс можно использовать как функтор.
И в ваших конструкторах вы должны как можно больше использовать список инициализаторов.
Следующие рекомендации применимы к вашему коду. Конечно, я передал аргумент в конструктор B. Если это не вариант, используйте локальное хранилище потока .
class B {
public:
explicit B(int value) : value(value)
void operator()();
private:
int value;
};
class X {
public:
int value;
X(int x) :value(x) { }// use the initializer list to initialize members
void operator()() {
B b(value); // allocate B on the stack if possible
b();
}
};
void B::operator()() {
std::cout << value << std::endl;
}
int main() {
boost::thread thr(X(3));
thr.join();
}
Конечно, в этом простом примере вам не нужны два класса. С таким же успехом вы могли бы полностью удалить X
и сделать:
class B {
public:
explicit B(int value) : value(value)
void operator()();
private:
int value;
};
void B::operator()() {
std::cout << value << std::endl;
}
int main() {
boost::thread thr(B(3));
thr.join();
}