1

在我的项目中,有一个基类和三个不同的派生类。我在基类中有一些宏变量写为 const int 。所有派生成员都将访问这些成员并且将看到相同的值。因为它是一个常量,并且不会改变,所以保持 3 个不同的值会浪费空间。因此,我想要一种方法来只维护基类 const 成员的一个副本,以便所有派生类都使用相同的。

例子

 //Base.hpp
 Class Base {

       const int ZER0;
       const int ONE;
 };

 //Derived1.hpp
 class Derived1:public Base {
      int some_method1(); 
 };

  //Derived1.cpp

  int Derived1::some_method1() {

    int value = ZERO;
  }

 //Derived2.hpp

 class Derived2:public Base {
    int some_method2();
 };

//Derived2.cpp

int Derived2::some_method2() {
   int value = ONE;
}

//main.cpp

Derived1 d1;
d1->some_method1();

Derived d2;
d2->some_method2();

//在这两种方法中,值都是恒定的,但零和一仍然会有不同的空间。有没有办法,我只维护一个副本?我可以想到静态变量。在类中使用静态是否可以,我在哪里初始化静态变量。请指教。

PS:这个问题可能是重复的,但是我找不到类似的东西,如果你觉得是这样,请随时重定向到相应的文章/问题;

4

2 回答 2

3

如果我对您的理解正确,枚举会满足您的需求吗?

class Base
{
    enum 
    {
        ZERO,
        ONE
    };
};
于 2012-04-07T15:42:58.987 回答
0

我认为您可以使用虚拟基础继承来维护一份 base ..

//Base.hpp
class Base {
public:
    Base() {}
    virtual ~Base() {}
protected:
    static const int ZER0;
    static const int ONE;
};

//Base.cpp
const int Base::ZER0 = 0;
const int Base::ONE = 1;

//Derived1.hpp
class Derived1 : public virtual Base {  //using virtual keyword here maintains one copy of base class, thus one copy of ONE and ZERO for all objects since they are static members of Base. You must read about diamond problem of virtual inheritence to understand this properly.

public:
    Derived1() :Base() {}
    int method1();
};

//Derived1.cpp

int Derived1::method1() {
    int value = ZER0;
    return value;
}

//Derived2.hpp

class Derived2 : public virtual Base {
public:
    Derived2() :Base() {}
    int method2();
};

//Derived2.cpp

int Derived2::method2() {
    int value = ONE;
    return value;
}

//main.cpp


int main() {
    Derived1 d1;
    d1.method1();  // . instead of -> , -> is used for member access through pointers

    Derived2 d2;
    d2.method2();

    return 0;
}
于 2016-08-16T17:15:11.837 回答