所以说我有3个类:Base,A和B.
Base是A类和B类的基类。
Base有一个变量val,A和B可以访问。
如果我可以通过A类设置val变量,我怎样才能使它工作?它会反映在B类中?
例如:
我知道下面这段代码不起作用,因为我正在创建一个类型为a和b的OBJECT。
我想要做的是简单地让a和b共享相同的变量,这样只要a
对它做了某些事情,它就会反映在b
中。
a aa;
b bb;
aa.SetVal(50000);
cout << aa.GetVal() << endl;
cout << bb.GetVal() << endl;
最后,我希望两条cout
行打印出50000。
编辑:A类和B类将进行不同的操作,只需要能够访问/更改基础中的val变量
答案 0 :(得分:3)
您可以使该成员成为基类的静态成员,然后所有派生类都可以访问它,但是派生的任何更改静态成员的对象都会为每个其他对象更改它。
class Base
{
public:
int GetVal()
{
return val;
}
void SetVal( int newVal )
{
val = newVal;
}
private:
static int val;
};
// Need to instantiate the static variable somewhere
int Base::val = 0;
class A : public Base
{};
class B : public Base
{};
答案 1 :(得分:1)
这是引用的工作,而不是类。只需要一个类X
并创建对象的引用:
X aa;
X& bb = aa;
aa.SetVal(50000);
std::cout << aa.GetVal() << std::endl;
std::cout << bb.GetVal() << std::endl;
输出将是:
50000
50000
请记住,始终使用正确的工具来完成工作并保持简单。
主要目标是这两个类将执行不同的操作,但需要能够访问和共享单个变量。
解决这个问题的一个想法是在另一个类中提取公共变量,即S
,它将传递给A
和B
,如下所示:
std::shared_ptr<S> s = new S();
A aa(s);
B bb(s)
现在,aa
和bb
共享相同的S
对象,并且可以非常轻松地修改它。请注意,A
和B
的构造函数也应存储std::shared_ptr<S>
:
class A { // and B
private:
std::shared_ptr<S> s;
public:
A(std::shared_ptr<S> as) : s(as) {}
};
变量s
只要aa
和bb
中的任何一个活着,就会持续aa
和{{1}如果取消分配或超出范围,变量bb
也将被解除分配。
如果公共变量的类型应该在堆栈上,您也可以只使用引用,但要注意s
,aa
和该变量的生命周期:
bb
使用:
int s = 0;
A aa(s);
B bb(s);
但作为一般的经验法则,我会避免对象之间的共享状态。大多数情况下,根据上下文,您可以重构代码并摆脱共享依赖。
答案 2 :(得分:1)
class Base {
static int value;
public:
virtual ~Base() { }
void setVal(const int& val) {
value = val;
}
int getVal() const {
return value;
}
};
int Base::value = 0;
class A : public Base {
};
class B : public Base {
};
#include <iostream>
int main() {
A a;
B b;
a.setVal(20);
std::cout << b.getVal(); // 20
}
答案 3 :(得分:0)
如果共享值在基类中是静态的,那么派生类的所有实例都将看到一个基类成员。
如果值不是静态的,那么类的每个实例都将拥有自己的副本,无论该值是否在基类中。
答案 4 :(得分:0)
不确定我明白你要做什么。您是否希望A和B的所有实例共享相同的值?如果是这样,请在基类中将其声明为静态。 如果没有,你想如何选择哪一个会分享价值呢?