【问题标题】:passing a class variable to API function将类变量传递给 API 函数
【发布时间】:2020-02-24 19:48:45
【问题描述】:

我想跟踪我传递给 API 函数的全局变量。我发现可以使用一个类来做到这一点:

template <class T>
class MonitoredVariable
{
public:
    MonitoredVariable() {}
    MonitoredVariable(const T& value) : m_value(value) {}

    //T operator T() const { return m_value; }

    const MonitoredVariable& operator = (const T& value)
    {
        PlugIn::gResultOut << "value changed " << std::endl;
        m_value = value;
        return *this;
    }


private:
    T m_value;
};

API函数将变量作为

bool APIFunction(double time, bool *is_done, double *fraction_done);

以下给我一个错误:

ImagePtr Im;
bool is_done;
MonitoredVariable<double*> fraction_done;
bool frameready = Im->APIFunction(2.1, is_done, fraction_done);

ERROR:
    error C2664: cannot convert argument 3 from 'MonitoredVariable<double *>' to 'double *'

我需要在这里改变什么? 谢谢!

【问题讨论】:

  • 在函数调用中使用*is_done 是不是拼写错误?如果没有,你真的应该从good textbook 那里学习该语言的基础知识。
  • 是的,这是一个错字。 fraction_done 是这里的问题....
  • 请在你的帖子中修正这个问题,这样其他人就不会被它分心/困惑。

标签: api c++11 pointers pass-by-reference


【解决方案1】:

我不确定这是否是你想要的:

#include <iostream>

using namespace std;

template <class T>
class MonitoredVariable
{
public:
    MonitoredVariable() {}
    MonitoredVariable(const T& value) : m_value(value) {}

    //T operator T() const { return m_value; }

    const MonitoredVariable& operator = (const T& value)
    {
        //PlugIn::gResultOut << "value changed " << std::endl;
        m_value = value.m_value;
        return *this;
    }

    void printValue() {
        std::cout << m_value;
    }

    T& getValue() {
        return m_value;
    }

private:
    T m_value;
};

bool func(double firstDouble, bool *is_done, double* fraction_done) {
    // do stuff

    *fraction_done = firstDouble + (40.23 * 5);
    *is_done = true;
    return true;
}

int main()
{
    bool is_done = true;
    MonitoredVariable<double> fraction_done;

    func(2.10, &is_done, &fraction_done.getValue());

    fraction_done.printValue();

    return 0;
}

所以基本上我们有一个名为 MonitoredVariable 的类,它有一个名为 m_value 的变量。我不太确定您为什么希望它成为指针,因为我们也可以获取普通双精度变量的地址。

【讨论】:

    【解决方案2】:

    在下文中,我想要实现的目标可能更有意义。我想将一个类变量输入到 API 函数中并实时监控该变量。该值每 3 ms 左右从 0 变为 1。但是我尽量避免使用 while 循环,并在类中使用重载的 = 运算符对其进行跟踪。

    #include "stdafx.h"
    #include <iostream>
    #include <thread>
    #include <future>
    
    using namespace std;
    
    template <class T>
    class MonitoredVariable
    {
    public:
        MonitoredVariable() {}
        MonitoredVariable(const T& value) : m_value(value) {}
    
    
        void printValue() {
            std::cout << m_value;
        }
    
        const MonitoredVariable& operator = (const T& value)
        {
            m_value = value.m_value;
            if(m_value> 0.8) std::cout << m_value;  // *THIS NEVER GETS PRINTED!!!*
    
            return *this;
        }
    
    
        T& getValue() {
    
            return m_value;
        }
    
    private:
        T m_value;
    };
    
    bool func(bool *is_done, double* fraction_done) {
    
        unsigned long c = 1;
    
        while (*is_done)
        {
            *fraction_done =  (double) 0.01*c;
            this_thread::sleep_for(chrono::milliseconds(10));
            c++;
            if (*fraction_done >= 1) *is_done = false;
        }
    
        return true;
    }
    
    int main()
    {
    
        bool is_done = true; 
        MonitoredVariable<double> *MonitoredVariablePtr = new MonitoredVariable<double>();
    
        std::future<bool> fu = std::async(std::launch::async,func, &is_done, &MonitoredVariablePtr->getValue()); 
    
    
        // IF I UNCOMMENT THIS, IT PRINTS...
         /*
        while(is_done)
        {
        if(MonitoredVariablePtr->getValue() > 0.8)  MonitoredVariablePtr->printValue();
        }
        */
    
    return 0;
    }
    

    为什么类中的 (if(m_value> 0.8) std::cout

    谢谢!

    【讨论】:

      猜你喜欢
      • 2017-04-15
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      相关资源
      最近更新 更多