我正在尝试创建一个类Parallel
,它是std::thread
的子类,因此我的类在Parallel.h
中定义,但是在单独的文件{{1}中定义的主方法在同一个项目中(在visual studio中)。当我在main.cpp
方法中创建Parallel
的实例并执行join()
函数时,如下面的代码段:
我是C ++的新手,这里是“Parallel.h” -
main()
//在main.cpp
中#include<thread>
using namespace std;
namespace Para{
class Parallel:thread
{
public:
static void run(){
}
Parallel(void)
{
}
virtual ~Parallel(void)
{
}
inline static void start(Parallel* p){
// (*p).join();
}
virtual void Parallel::start(thread& t){
}
static void parallelize(Parallel& p1,Parallel& p2){
}
inline virtual Parallel* operator=(thread* t){
return static_cast<Parallel*>(t);
}
}
问题是如何定义一个具有重载构造函数的线程类的正确子类,该函数名称作为参数,
当定义void main(){
Parallel p;
p.join();
thread t(print);
t.join();
system("Pause");
}
编译器在VS2012中给出以下错误时:
错误2错误C2247:'std :: thread :: join'无法访问,因为'Para :: Parallel'使用'private'继承'std :: thread'C:\ Users \ Gamer \ Desktop \ PROJECQ \ VC ++ @ OMAQ \ CQ47 \ CQ47 \ main.cpp 11
3 IntelliSense:函数“std :: thread :: join”(在“H:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC \ include \ thread”的第209行声明)无法访问c:\ Users \ Gamer \ Desktop \ PROJECQ \ VC ++ @ OMAQ \ CQ47 \ CQ47 \ main.cpp 11
答案 0 :(得分:5)
当您尝试调用'p.join()'时,“使用'private'继承”的错误是因为您写了:
class Parallel:thread
你应该写的时候:
class Parallel : public thread
默认是私有继承,这意味着基类的所有方法在继承类上变为私有。如果您希望继承可以访问,则必须指定继承应该是公共的。
答案 1 :(得分:1)
在Java函数中不是一等公民,因此与函数相关的所有内容都是通过类和继承来实现的,就像在Swing的Observer模式的实现中一样:创建一个实现事件处理程序接口的类(您必须实现整个类才能提供功能)。
线程也是如此:因为你不能将一个函数传递给线程(因为Java没有“函数”的概念),你必须从实现你自己的函数的线程类派生来执行,或者传递一个实现Runnable
接口的类,它提供了要执行的函数(正如在Observer
情况下一样)。
在C ++中,函数是一等公民(以函数指针,lambdas,functor等形式),所以这里的机制是将要执行的函数传递给线程。
如果您拥有的是OO dessign,请考虑通过合成(将执行的线程存储为类的成员)来适应线程,而不是继承它。
仅作为旁注,Java 8实现了lambda,并通过它们提供函数引用(Hooray!)。但是它使用接口来实现lambdas,因为它认为在Java函数中永远不会是一等公民。接口的问题在于它完全打破了lambdas的普遍性:lambda可以在与其签名匹配的任何上下文中使用。这与Java lambdas不一样:你必须实现相同的接口。