假设我有一个B类,它在另一个类A的构造函数中得到一个值'v'。如何从C类中读取这个值? C类将按需实例化,但A已经创建了B并且已经传递了'v'。 'v'将在每个实例中发生变化。我试图在B类中使'v'静态。它会起作用吗?我无法正确实施它。
Class A {
public:
int* v;
B b1;
A(int* var) : v(var), b1(var) {};
}
如何从C类访问相同版本的'v'? 我可以定义B和C然而我喜欢为了达到目标。但是我不能为此目的改变A.
答案 0 :(得分:4)
您需要一个(公共)静态成员
class A { //let's stick with your naming convention!
public:
static int a;
}
A::a = 4;
然而,允许人们改变A :: a意味着你的程序可能最终依赖于全局未封装的状态......这通常是设计糟糕的标志。
如果你的成员是const
,那么你真的将一个常数与你的班级联系起来,这并不是那么糟糕。
class A {
public:
static const int a = 4;
}
std::cout << "A:a is always " << A::a << std::endl;
基于更新问题的编辑 如果您需要帮助建立课程,我建议您使用某种工厂。如果我理解您的要求,您希望能够为每个A类和B类实例注入一个值。该值“v”基于C类。
因此...
class C {
private:
// up to you where you implement the getUniqueNumberForNow function
// (global free function for example)
static const int v = getUniqueNumberForNow();
public:
static A createA(){
return A(v);
}
static B createB(){
return B(v);
}
}
getUniqueNumberForNow()
函数只会获得您应有的价值。然后,它会存储在class C
中,并可在创建A
和\ B
期间使用。现在只需将A
和B
的CTOR设为私有,并使C
成为friend
两者,您将只有一种方法可以创建A
或{ {1}},它将始终使用正确的值。
有关朋友类的信息,请参阅以下评论中的NeilMonday链接。
最后一件事是,如果您想要为B
的每个实例化更改值,您可以在工厂中执行此操作:
A
但是,如果真的你想要什么,那么就这样做:
static A createA(){
return A(getUniqueNumberForNow());
}
答案 1 :(得分:1)
您无法访问从未传递给班级的'v'。相反,您可以将它的静态副本作为A类中的成员。它将在每次实例化A时更新:
Class A {
public:
int* v;
static int* staticv;
...// Constructor etc
}
在您的.cc代码中:
int* A::staticv;
...
A::staticv=this->v;
现在任何类都可以通过以下方式访问此值:
A::staticv;