假设我有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。
发布于 2014-03-10 10:20:19
您无法访问从未传递给该类的“v”。相反,您可以将其作为A类中的成员进行静态复制。每次A被实例化时,它都会更新如下:
Class A {
public:
int* v;
static int* staticv;
...// Constructor etc
}
在A的.cc代码中:
int* A::staticv;
...
A::staticv=this->v;
现在,任何类都可以通过以下方式访问此值:
A::staticv;
发布于 2014-03-10 05:18:20
您需要一个(公共)静态成员。
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
、an\或B
期间使用。现在,只需将A
和B
的CTORs设为私有,并使C
成为两者的friend
,您将只有一种方法来创建A
或B
,并且它将始终使用正确的值。
有关朋友课程的信息,请参阅下面评论中的NeilMonday链接。
最后一件事是,如果您希望对A
的每个实例化进行值更改,您可以在工厂中这样做:
static A createA(){
return A(getUniqueNumberForNow());
}
但是,如果这是真正的,那么只需执行以下操作:
class A {
public:
A() : val (getUniqueNumberForNow()), b(B(val)){}
}
https://stackoverflow.com/questions/22301141
复制