Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有方法重载运算符=使右侧的函数具有特定行为_C++_Operator Overloading - Fatal编程技术网

C++ 是否有方法重载运算符=使右侧的函数具有特定行为

C++ 是否有方法重载运算符=使右侧的函数具有特定行为,c++,operator-overloading,C++,Operator Overloading,我有一个名为Image的类,我希望非成员函数返回到Image中 我是这样使用它的: Image p = requestImg("grass.png"); 这很好,但是-我希望能够让requestImg生成一个线程,将图像加载到image objectp中,同时修改该对象使其状态为loading=true 换句话说 Image p = requestImg("grass.png"); //image is loading std::cout << p.loading <<

我有一个名为Image的类,我希望非成员函数返回到Image中

我是这样使用它的:

Image p = requestImg("grass.png");
这很好,但是-我希望能够让requestImg生成一个线程,将图像加载到image objectp中,同时修改该对象使其状态为loading=true

换句话说

Image p = requestImg("grass.png");  //image is loading
std::cout << p.loading << std::endl; //true
//some time passes
std::cout << p.loading << std::endl; //false
p最初不能将加载设置为true,因为它不会加载,也不会导致正常命名。我意识到使用成员函数会更容易,甚至可以传递一个指向该函数的指针,但是有没有任何方法可以按照我所说的那样做到这一点?

您可以保持图像的原样并使用它,这将给您一个。您可以决定何时需要结果:

#include <future>

auto p = std::async(std::launch::async, &requestImg,"grass.png"); // load image asynchronously
//some time passes
// do other work

// now we really need the image
auto img = p.get(); // blocking call, requires async call to be done loading image.
您可以保持图像的原样,并使用它,这将给您一个更好的体验。您可以决定何时需要结果:

#include <future>

auto p = std::async(std::launch::async, &requestImg,"grass.png"); // load image asynchronously
//some time passes
// do other work

// now we really need the image
auto img = p.get(); // blocking call, requires async call to be done loading image.

这是我用来实现这一目标的通用代码,我很接近,但我们可以称之为已解决。它使用临时的futureImage来处理未来,并使用复制构造函数重载来创建新线程并填充此。。。未来以下是类型:

class Image {
private:
        std::future<Image> * futureImage; //just a temporary for threading
        void threadingwork(); //this takes futureimage and sets values of self once it finishes
    public:
        Image(std::future<Image> p); //this sets loading = true, and sets the future + creates a thread which calls threadingwork above
};

std::future<Image> requestImg(std::string filename);

正确解析并正确使用复制构造函数。

这是我用来实现这一目标的通用代码,我很接近,但我们可以称之为已解决。它使用临时的futureImage来处理未来,并使用复制构造函数重载来创建新线程并填充此。。。未来以下是类型:

class Image {
private:
        std::future<Image> * futureImage; //just a temporary for threading
        void threadingwork(); //this takes futureimage and sets values of self once it finishes
    public:
        Image(std::future<Image> p); //this sets loading = true, and sets the future + creates a thread which calls threadingwork above
};

std::future<Image> requestImg(std::string filename);

正确解析并正确使用复制构造函数。

为什么不调用函数而不是生成额外的线程?在函数中调用图像,并在一个大函数中设置为boolean到false。我需要它立即返回。为什么要重载赋值运算符?您给出的代码调用的是复制构造函数,而不是赋值运算符。图像p=requestImggrass.png;当使用另一个现有对象实例化对象时,编译器调用复制构造函数。@ MRCURL5您是正确的,我对C++如何处理这个问题印象不好。我在下面添加了我用来解决这个问题的函数声明。谢谢你的帮助。你为什么不调用一个函数而不是生成一个额外的线程呢?在函数中调用图像,并在一个大函数中设置为boolean到false。我需要它立即返回。为什么要重载赋值运算符?您给出的代码调用的是复制构造函数,而不是赋值运算符。图像p=requestImggrass.png;当使用另一个现有对象实例化对象时,编译器调用复制构造函数。@ MRCURL5您是正确的,我对C++如何处理这个问题印象不好。我在下面添加了我用来解决这个问题的函数声明。谢谢你的帮助。我不知道我能不能把这个和我的东西结合起来。我的意思是,使用异步,我将不会有图像对象,我可以在其中检查加载是否完成?@jett you can,某种程度上。未来有两种定时等待方法。它们返回一个状态,告诉您异步工作是否已完成。我链接了一些std::future文档。好的,我明白了,嗯,很接近。我会考虑,现在我正在尝试一个重载=运算符产生一个线程,但我不认为我会远远超过它必须等待返回。犯错误我真希望有一种方法可以将lhs与未来绑定起来。@jett请记住operator=与此无关,至少在您展示的代码中没有。这意味着问题的标题有点混乱。@jett对,这是一个初始化,它调用构造函数,而不是赋值运算符。我不确定我是否理解如何将其与我所拥有的集成起来。我的意思是,使用异步,我将不会有图像对象,我可以在其中检查加载是否完成?@jett you can,某种程度上。未来有两种定时等待方法。它们返回一个状态,告诉您异步工作是否已完成。我链接了一些std::future文档。好的,我明白了,嗯,很接近。我会考虑,现在我正在尝试一个重载=运算符产生一个线程,但我不认为我会远远超过它必须等待返回。犯错误我真希望有一种方法可以将lhs与未来绑定起来。@jett请记住operator=与此无关,至少在您展示的代码中没有。这意味着问题的标题有点混乱。@jett right,这是一个初始化,它调用构造函数,而不是赋值运算符。