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);
}

begin.h

#include <iostream>
using namespace std;

#ifndef BEGIN_H
#define BEGIN_H

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

#endif

begin.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

コードbeginclassには明示的なコンストラクターがないため、暗黙的に定義されたデフォルトのコンストラクターが使用され、デフォルトですべてのメンバーが構築されます。したがって、構築後beginclass::testは初期化されていないか、初期化されてい0ません。

あなたが望んでいるように見えるのは、beginclass::collectdata()複数回電話をかけないようにすることです。beginclass::collectdata()このために、が呼び出されたかどうかを記憶するフラグを設定する必要があります。データを返すメンバー関数は、最初にこのフラグをチェックし、フラグが設定されていない場合は、beginclass::collectdata()最初に呼び出します。CashCowによる回答も参照してください。

于 2014-08-07T16:03:01.833 に答える
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;
   }
};

const にしたい場合multiplyは、do_multiply も const と値とフラグを変更可能にする必要があります。

于 2014-08-07T15:57:22.127 に答える