将静态成员的作用域限制为n个特定的类
Limiting the scope of a static member to n specific classes
如何将静态成员的作用域限制为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值,但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的正确方法。
相关文章:
- 不同作用域中的静态变量和全局变量
- 在构造函数中输入对象时C++类成员作用域
- 为什么不能直接引用作用域枚举类成员,而不能为无作用域枚举生成类成员?
- 无法从派生类型的作用域访问另一个实例的受保护成员
- 缩短成员函数作用域说明符(嵌套类)(C++)
- 如何在C++中嵌套词法作用域可访问的作用域中声明静态信息?
- 在没有显式作用域的情况下无法访问模板基类的静态成员
- 类的静态成员变量(受保护)的作用域
- 使用作用域内生成的指针初始化静态成员
- C++静态成员函数中静态变量的作用域
- 使用作用域运算符访问非静态成员变量
- 应用程序有2个静态变量作用域
- 静态成员初始化器的Lambda作用域
- 被视为依赖作用域的函数模板的函数作用域结构体的静态成员函数
- c++中如何初始化全局作用域的静态成员
- 将静态成员的作用域限制为n个特定的类
- 静态类数据成员的作用域
- c++中的局部/静态变量作用域
- 静态成员变量文件作用域
- 如何在实例和静态作用域之间创建成员变量