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

静态成员的全部意义在于它是“一个无处不在”[并非没有限制,但出于这个问题的目的,我们忽略它]。

在您的示例代码中,您似乎想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;
     }
 }

第二种选择涉及这样的功能:

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

然后ref(id)在您需要参考时致电。你需要想办法为这个生成“id”。

根据您想要实现的具体目标,可能还有很多其他解决方案。我很确定你的问题是一个 XY 问题——你在问如何做 Y,因为你认为这是实现 X 的正确方法。

于 2013-04-09T16:37:45.147 回答