4

我正在尝试创建一个Parallel作为子类的类std::thread,因此我的类定义在 中Parallel.h,但主要方法定义main.cpp在同一项目(在 Visual Studio 中)的单独文件中。当我创建一个实例并在方法中Parallel执行join()函数时,如下所示main()代码段:我是 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);
    }
}

//在main.cpp中

void main(){

    Parallel p;
    p.join();
    thread t(print);
     t.join();
     system("Pause");

}

问题是如何定义线程类的正确子类,该线程类具有以函数名作为参数的重载构造函数,在定义p.join()编译器时也会在 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\桌面\PROJECQ\VC++@OMAQ\CQ47\CQ47\main.cpp 11

4

2 回答 2

6

当您尝试调用 'p.join()' 时,有关“使用 'private' 继承”的错误是因为您编写了:

    class Parallel:thread

当你应该写:

    class Parallel : public thread

默认是私有继承,这意味着基类的所有方法在继承类上都变成私有的。如果您希望它们可访问,则必须指定继承应该是公共的。

于 2013-10-06T20:43:35.323 回答
1

在 Java 中,函数不是一等公民,所以与函数相关的一切都是通过类和继承来实现的,就像 Swing 的观察者模式的实现一样:您创建一个实现事件处理程序接口的类(您必须实现整个类只是为了提供一个功能)。

线程也是如此:因为你不能将函数传递给线程(因为Java没有“函数”的概念),你必须从实现你自己的函数的线程类派生来执行,或者传递一个类实现Runnable提供要执行的功能的接口(与案例完全相同Observer)。

在 C++ 中,函数是一等公民(以函数指针、lambda、仿函数等形式),因此这里的机制是将要执行的函数传递给线程。

如果您拥有的是 OO 设计,请考虑通过组合(将执行线程存储为类的成员)来适应线程,而不是从它继承。

注意:Java 8

仅作为旁注,Java 8 实现了 lambda,并通过它们提供了函数引用(万岁!)。但它使用接口实现 lambda,因为它表明在 Java 中函数永远不会是一等公民。接口的问题在于它完全打破了 lambda 的普遍性:一个 lambda 可以在任何匹配其签名的上下文中使用。Java lambdas 并非如此:您必须实现相同的接口。

于 2013-10-06T15:02:05.530 回答