C ++有两个子类从它们的基类共享一个变量

时间:2013-12-03 19:16:33

标签: c++ class inheritance polymorphism

所以说我有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变量

5 个答案:

答案 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,它将传递给AB,如下所示:

std::shared_ptr<S> s = new S();
A aa(s);
B bb(s)

现在,aabb共享相同的S对象,并且可以非常轻松地修改它。请注意,AB的构造函数也应存储std::shared_ptr<S>

class A { // and B
private:
    std::shared_ptr<S> s;
public:
    A(std::shared_ptr<S> as) : s(as) {}
};

变量s只要aabb中的任何一个活着,就会持续aa和{{1}如果取消分配或超出范围,变量bb也将被解除分配。

如果公共变量的类型应该在堆栈上,您也可以只使用引用,但要注意saa和该变量的生命周期:

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的所有实例共享相同的值?如果是这样,请在基类中将其声明为静态。 如果没有,你想如何选择哪一个会分享价值呢?