1

以下のプログラムでは、checkという名前の1つのブール変数を使用します。これは、Tst1とTest2の2つのオブジェクトによってmain関数内でアクセスされています。ただし、チェック変数の値はプログラムで維持されません。静的を使用することはできますが、別の方法を知りたいのですが、誰かが私にいくつかのヒントを教えてもらえますか?前もって感謝します 。

Jointdeatils.hの内部

#pragma once

class Jointdetails
{
public:
    Jointdetails(void);
    ~Jointdetails(void);
    bool check;


};

Jointdeatils.cppの内部

#include "Jointdetails.h"

Jointdetails::Jointdetails(void)
{
    check = false ;
}

Jointdetails::~Jointdetails(void)
{
}

アナライザーの内部.h

#pragma once
#include "Jointdetails.h"
class Analyzer
{
public:
    Analyzer(void);
    Jointdetails* GetJointDetails();
    Jointdetails* m_ptheCTJointDetails;
    ~Analyzer(void);
};

Analyzer.cppの内部

#include "Analyzer.h"
#include "stddef.h"
Analyzer::Analyzer(void)
{
    m_ptheCTJointDetails = new Jointdetails();

}

Analyzer::~Analyzer(void)
{
}
Jointdetails* Analyzer::GetJointDetails()
{

    if(m_ptheCTJointDetails) 
        return m_ptheCTJointDetails;
    else
        return NULL;


}

Test1.hの内部

#pragma once
#include "Analyzer.h"
class Tst1
{
public:
    Tst1(void);
    Analyzer *analyzer1 ;
public:
    ~Tst1(void);
};

Test1.cppの内部

#include "Tst1.h"

Tst1::Tst1(void)
{
    analyzer1 = new Analyzer ;
}

Tst1::~Tst1(void)
{
}

Test2.hの内部

#pragma once
#include "Analyzer.h"
class Test2
{
public:
    Test2(void);
    Analyzer *analyzer2 ;
public:
    ~Test2(void);
};

Test2.cppの内部

#include "Test2.h"

Test2::Test2(void)
{
    analyzer2 = new Analyzer ;
}

Test2::~Test2(void)
{
}

main.cppの内部

#include "Test2.h"
#include "Tst1.h"
#include "stdio.h"

int main()
{
    Tst1 *test1 = new Tst1 ; //check = false
    Test2 *test2 = new Test2 ; //check = false
    test1->analyzer1->GetJointDetails()->check = true ;
    if(test2->analyzer2->GetJointDetails()->check )
        printf("Check value is changed");
    else
        printf("Check value is not changed");
        return 0 ;
}
4

3 に答える 3

1

これを行うには、2つの方法しかありません。

  1. staticストレージデータを使用する
  2. 自動または動的ストレージデータをパラメーターとして宛先関数/ctorsに渡します

方法1は、どの関数からでもそのようなデータに直接アクセスできるため、より便利です。しかし、それは邪悪なグローバル変数とほとんど同じものであるため、悪い設計と見なされます。

方法2はより正確ですが(たとえば、ジャスティンによる回答を参照、少しイライラする可能性があります。必要なデータをパラメーターとして各必要な関数に渡すか、データをクラスデータメンバーとして格納する必要があります。多くのクラス/ネストされた呼び出しの場合、快適な作業ではありません。

それでも、方法1の欠点を気にしない場合は、シングルトンオンデマンドの概念を検討してください。静的データをより動的な方法で使用できます。オンデマンドで作成し、複数のユーザーによるアクセスを共有し、誰も使用しなくなったときに破棄します。例を参照してください(簡潔にするために、いくつかの詳細、インクルードなどはスキップされています):

JointDetails.h

 class JointDetails
 {
    // Actual class definition
    // ...
 public:

    // Function accessing to JointDetails instance
    static std::shared_ptr<JointDetails> Get();
 };

JointDetails.cpp

 std::shared_ptr<JointDetails> JointDetails::Get()
 {
    static std::weak_ptr<JointDetails> s_trackInstance;
    if(s_trackInstance.expired())
    {
       auto instance = std::make_shared<JointDetails>();
       s_trackInstance = instance;
       return instance;
    }

    return s_trackInstance.lock();
 }

Analyzer.h

// All instances of Analyzer share the same instance of JointDetails.
// But JointDetails instance is created dynamically only when first instance of
// Analyzer is created and destoyed when the last instance of Analyzer is destroyed.
class Analyzer
{
   std::shared_ptr<JointDetails> m_details;
public:
   Analyzer(): m_details(JointDetails::Get()) {}
   const JointDetails& GetDetails() const { return *m_details; }
};
于 2012-09-02T20:36:14.473 に答える
0

チェックを静的にするか、JointDetailsをシングルトンにする必要があります(これもstaticキーワードを使用します)。

チェックを静的にすると、JointDetailsのすべてのインスタンスが同じチェックを持つことになります。

JointDetailsをシングルトンにすると、JointDetailsオブジェクトへのすべての参照が同じオブジェクトであるため、Tst1とTest2の両方が同じオブジェクトへのポインターを持つことになります。

私は後者があなたが探しているものだと思います:

Jointdetails.h

#pragma once

class Jointdetails
{
public:
    ~Jointdetails(void);
    bool check;

    static Jointdetails* getInstance();
private:
    Jointdetails(void);
};

Jointdetails.cpp

#include "Jointdetails.h"

Jointdetails::Jointdetails(void)
{
    check = false ;
}

Jointdetails::~Jointdetails(void)
{
}

Jointdetails* Jointdetails::getInstance() {
    static Jointdetails s_instance;
    return &s_instance;
}

Analyzer.cpp

Analyzer::Analyzer(void)
{
    m_ptheCTJointDetails = Jointdetails::getInstance();
}
于 2012-09-02T18:32:38.300 に答える
0

new0)それほど頻繁に使用する必要はありません。

1)コンストラクターのパラメーターとしてジョイントの詳細を使用してオブジェクトを作成できます。

説明する:

class Tst1 {
public:
  Tst1(Jointdetails& pJointdetails) : analyzer1(pJointdetails) {
  }

  Analyzer analyzer1;
public:
  ~Tst1(void);
};

int RunProgram(Jointdetails& pJointdetails) {
  Tst1(pJointdetails);
  ...
}

int main() {
  Jointdetails jointdetails;
  const int result(RunProgram(jointdetails));
  return result;
}
于 2012-09-02T18:53:29.193 に答える