0

静的メンバーのスコープを特定のクラスに制限する方法は? たとえば、クラス A の a1 オブジェクトとクラス A の a2 オブジェクトを作成する場合、これらのオブジェクト (A で作成された a1、a2) は静的メンバーに対して異なる値を持つことができますが、対応する派生クラスに対しては同じです。

  class A{
    public:
           A(int member){
               A::mMember=member;}
           void set(int member){
               A::mMember=member;}
           int get(){
               return A::mMember;}
        protected:
           static int mMember;
    };

    int A::mMember;

    class B:public A{
    public:
        B(int member):A(member){};
    };

    class C:public A{

        C(int member):A(member){};

    };

    int main()
    {   

      A * a1= new A(1);
         std::cout<<"a1: "<< a1->get()<<std::endl;
         B * b1= new B(2);
         std::cout<<"a1: "<< a1->get()<<std::endl;

         // How to make a1 continue be a1=2 and a2 = 5. I mean how to limit a static member     
         //to  only its derivated class
         A * a2 = new A(5);
         std::cout<<"a1: "<< a1->get()<<std::endl;
         std::cout<<"a2: "<< a2->get()<<std::endl;

    }
4

1 に答える 1

2

静的メンバーの全体的なポイントは、それが「どこにでも1つ」であることです[制限がないわけではありませんが、この質問の目的のためにそれを無視しましょう]。

b1 = B(2)あなたのコード例では、 A 値を変更したいようですa2が、mMember. これは、静的メンバーを使用して行うことはできません。

私には、あなたが本当に欲しいのは、新しいオブジェクトが必要なときと必要でないときを認識し、関連するコンストラクターでこのオブジェクトへの参照を渡すファクトリー関数、または何らかのストレージ ( Aの静的メンバー関数)。

最初のケースでは、次のようになります。

class A
{
    public:
       A(int member, int &ref_member) : mref_member = ref_member
       {
           A::mMember=member;
       }
       void set(int member)
       {
           A::mMember=member;
       }
       int get(){
           return A::mMember;
       }
    protected:
       static int mMember;
};

int A::mMember;

class B : public A
{
    public:
        B(int member, int &ref_member) : A(member,ref_member)
        {
        };
};


A* maker(int v, bool needs_new_ref, char type)
{
     static int *ref = NULL;
     if (needs_new_ref || !ref)
     {
        ref = new int;
     } 
     switch(type)
     {
         case 'A':
             return new A(v, ref);
             break;
         case 'B':
             return new B(v, ref);
             break;
     }
 }

2 番目の選択肢には、次のような関数が含まれます。

 int& ref(int id)
 {
    static map<int, int> refs;
    return refs[id];
 }

次にref(id)、参照が必要なときに呼び出します。この「ID」を生成する方法を理解する必要があります。

達成したいことによっては、他にも多くの解決策があるかもしれません。あなたの質問は XY の質問であると確信しています。Y を行う方法を尋ねているのは、それが X を達成する正しい方法だと考えているからです。

于 2013-04-09T16:37:45.147 に答える