如何在C++(std::thread的子类)中正确创建线程类的子类
How to create a subclass of thread Class properly in C++(subclass of std::thread)
我正在尝试创建一个类Parallel
它是std::thread
的子类,因此我的类是在Parallel.h
中定义的,但是在单独的文件中定义了main方法main.cpp
在同一项目中(在Visual Studio中(。当我创建一个Parallel
实例并在main()
方法中执行join()
函数时,如下面的代码段:我是C++新手,这里是"Parallel.h"-
#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);
}
}
//在主.cpp
void main(){
Parallel p;
p.join();
thread t(print);
t.join();
system("Pause");
}
问题是如何定义一个线程类的正确子类,该子类具有以函数名称作为参数的重载构造函数,以及当p.join()
编译器定义时,在VS2012中给出以下错误:
错误2 错误 C2247:"std::thread::join"不可访问,因为"Para::P arallel"使用"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
当您尝试调用"p.join(("时,关于"使用'private'继承"的错误是因为您编写了:
class Parallel:thread
当你应该写:
class Parallel : public thread
默认值为私有继承,这意味着基类的所有方法在继承类上都变为私有。如果希望继承可访问,则必须指定继承应为公共继承。
在 Java 中,函数不是一等公民,因此与函数相关的一切都是通过类和继承来实现的,就像在 Swing 的观察者模式的实现中一样: 你创建一个类来实现事件处理程序的接口(你必须实现整个类才能提供一个函数(。
线程也会发生同样的情况:因为你不能将函数传递给线程(因为Java没有"函数"的概念(,你必须从实现你自己的函数的线程类派生才能执行,或者传递一个实现Runnable
接口的类,该接口提供要执行的函数(与Observer
情况完全相同(。
在C++函数是一等公民(以函数指针、lambda、函子等形式(,所以这里的机制是将要执行的函数传递给线程。
如果你有一个 OO 分配,请考虑通过组合来适应线程(将执行线程存储为类的成员(,而不是从它继承。
注意:Java 8
仅作为旁注,Java 8 实现了 lambda,并通过它们提供函数引用(万岁!但是它使用接口实现lambda,因为它表明在Java中函数永远不会是一等公民。 接口的问题在于它完全打破了lambda的通用性:lambda可以在任何与其签名匹配的上下文中使用。Java lambdas并非如此:你必须实现相同的接口。
- 如何为定义的情况创建子类?
- 创建子类的多个实例,其中只有一个超类实例
- 创建一个函数,该函数使用模板创建类或子类的对象
- 在父类函数中创建子类 - 可能吗?
- 使用模板创建子类
- 创建子类复制构造函数时是否强制使用/创建默认的超级构造函数?[C++]
- 我如何告诉课程创建独特的子类
- 如何将字符串(ID)映射到新的子类对象C 的创建
- 创建 QQuickItem 子类的实例是否有问题,我不打算渲染或添加到 QML 树中的实例?
- C++:从两个包含子类 (typedef) 的列表创建一个列表
- C 如何用数组在类中创建子类
- 如何创建一个包含C 中的子类的类的链接列表
- 删除已创建的Qt元素和子类
- C++在子类中创建一个可用的方法
- 如何在OMNeT++中创建消息(.msg)的子类
- 我可以显示根据需要创建的对象(QLabel 的子类)吗?(我遇到的问题是删除它)
- 创建子类对象时, 是为超类创建的第二个对象
- 创建子类的向量
- 如何从嵌套的 lambda 表达式函子类创建
- 由子类创建的对象的c++重写函数