0

这可能是一个非常简单的问题,但是......在这里。(提前致谢!)

我正在简化代码,所以它是可以理解的。我想使用在另一个类中计算的变量而不再次运行所有内容。

来源.ccp

#include <iostream>
#include "begin.h"
#include "calculation.h"
using namespace std;
int main()
{
    beginclass BEGINOBJECT;

    BEGINOBJECT.collectdata();
    cout << "class " << BEGINOBJECT.test;

    calculationclass SHOWRESULT;
    SHOWRESULT.multiply();

    system("pause");
    exit(1);
}

开始.h

#include <iostream>
using namespace std;

#ifndef BEGIN_H
#define BEGIN_H

class beginclass
{
    public:
        void collectdata();
        int test;
};

#endif

开始.cpp

#include <iostream>
#include "begin.h"

void beginclass::collectdata()
{
    test = 6;
}

计算.h

#include <iostream>
#include "begin.h"

#ifndef CALCULATION_H
#define CALCULATION_H

class calculationclass
{
    public:
        void multiply();
};

#endif

计算.cpp

#include <iostream>
#include "begin.h"
#include "calculation.h"

void calculationclass::multiply()
{
    beginclass BEGINOBJECT;
    // BEGINOBJECT.collectdata(); // If I uncomment this it works...
    int abc = BEGINOBJECT.test * 2;
    cout << "\n" << abc << endl;
}
4

3 回答 3

5

只需将成员函数定义multiply

void calculationclass::multiply( const beginclass &BEGINOBJECT ) const
{
    int abc = BEGINOBJECT.test * 2;
    cout << "\n" << abc << endl;
}

并将其称为

int main()
{
    beginclass BEGINOBJECT;

    BEGINOBJECT.collectdata();
    cout << "class " << BEGINOBJECT.test;

    calculationclass SHOWRESULT;
    SHOWRESULT.multiply( BEGINOBJECT );

    system("pause");
    exit(1);
}
于 2014-08-07T15:56:33.423 回答
0

看起来您正在寻找某种惰性评估/缓存技术,其中在第一次请求时计算一个值,然后存储以随后返回它而无需重新评估。

在多线程环境中,实现这一点的方法(使用新的标准线程库)是使用std::call_once

如果您在单线程环境中,并且只想从类中获取值,请使用 getter 获取该值。如果它不是以“惰性”方式计算的,即类立即计算它,您可以将该逻辑放在类的构造函数中。

对于“calc_once”示例:

class calculation_class
{
   std::once_flag flag;
   double value;

   void do_multiply(); 
   double multiply();
public:

   double multiply()
   {
       std::call_once( flag, do_multiply, this );
       return value;
   }
};

如果你想multiply成为 const,你需要使 do_multiply 也 const 和 value 和 flag 可变。

于 2014-08-07T15:57:22.127 回答
0

在您的代码beginclass中没有显式构造函数,因此将使用隐式定义的默认构造函数,默认构造所有成员。因此,在构建之后beginclass::test0或未启动的。

您似乎想要的是避免beginclass::collectdata()多次调用。为此,您需要设置一个标志来记住是否beginclass::collectdata()已调用。返回数据的成员函数首先检查此标志,如果未设置标志,则beginclass::collectdata()首先调用。另请参阅 CashCow 的答案。

于 2014-08-07T16:03:01.833 回答