c++ - 将静态成员的范围限制为 n 个特定类

标签 c++ visual-c++ c++11 c++builder

<分区>

如何将一个静态成员的作用域限制在n个具体的类中?例如,如果我创建 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;

    }

最佳答案

静态成员的全部要点是它“无处不在”[并非没有限制,但为了这个问题的目的让我们忽略它]。

在您的示例代码中,您似乎希望 b1 = B(2) 更改 A 值,但 a2mMember 设置新值。使用静态成员这是不可能的。

对我来说,你真正想要的似乎是一个工厂函数,它知道你什么时候需要一个新对象,什么时候不需要,并在相关构造函数中传递对该对象的引用,或者某种存储(通过 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 的正确方法。

关于c++ - 将静态成员的范围限制为 n 个特定类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15906751/

相关文章:

c++ - 在不同的 C++ 编译器中有通用的解决方案来捕获异常类型被零除,段错误?

api - 如何学习 CATIA CAA V5 R18 c++ 中的流程

c++ - 是否可以使函数模板对不适当的类型而不是错误执行默认操作?

c++ - 如何关闭线程分离 C++?

c++ - 使用 Boost/C++ 以二进制格式序列化对象的首选方法

c++ - 为什么 std::string 分配两次?

c++ - Windows XP 上的真彩色 CImageList

visual-studio - 将/Zi 与/Z7 用于 Visual Studio C++ 项目有什么影响?

c++ - sizeof 对齐的空结构

c++ - 用 "var{args}"初始化是 C++0x 的新特性,还是仅仅是语法糖?