具有const值数组的Init基类

时间:2018-11-27 18:46:01

标签: c++ constructor const

我的问题:

如果我为基类中的const元素提议一个数组,并且在某些派生类中数组值应该不同,那么最好的方法是什么?

使用单个值很容易。 对于数组,我不知道有什么好的解决方案。

当然,此代码不起作用,它只能演示问题和所需的行为:

class Base1 {
public:
  Base1( uint32_t const arr[] ) : m_arr( arr[] ) {}
  // Base1( uint32_t const val ) : m_val( val ) {}
  void f1() {
    int const size = sizeof( m_arr ) / sizeof( uint32_t );
    for( int idx = 0; idx < size; ++idx ) {
      std::cout << "val: " << m_arr[idx] << std::endl;
    }
  }
private:
  uint32_t const m_arr[];
  // uint32_t const m_val;
};

uint32_t const c_arr_derived1[] = { 1, 2, 3 };

// uint32_t const c_val = 3;
class Derived1 : public Base1 {
public:
  Derived1() : Base1 ( c_arr_derived1 ) {}
  //Derived1() : Base1 ( c_val ) {}
};
  • 我可能可以在基本头文件中定义不同的const数组, 在派生类中使用定义,并选择两个数组之一 那个...但是看起来很尴尬。
  • 我可以在基类中设置不同的静态const数组(因此,所有数组在基类中始终可用),具有它们的数组,并在派生类中使用枚举选择数组中的一个数组。基类。

有什么好的解决方法吗?

注意:派生类最终将具有具有不同实现的纯虚函数,因此我想要一个抽象基类

有关评论的更新

  • 如上所述,它不一定是有效的c ++(如果声明为static uint32_t m_arr[]并正确定义,则g ++会编译)。该示例将仅显示我要实现的目标
  • 我认为,如果不使用c ++ 11,就不能使用构造函数来初始化数组。数组也很大,在ctor中,我想引用其他地方定义的const数组,以使外观整洁
  • 我想要数据const并存储在ROM中,理想情况下不要在构造时进行复制。如果std::vector可以做到,那么有人可以在不久之后详细说明一个例子吗?似乎是某事。我猜像here一样。对于具有const数据(结构)的大型数组,我更希望将值放在ctor之外的其他地方。

1 个答案:

答案 0 :(得分:0)

前一段时间,无论如何,以下是我最终使用的内容。

  • 它可以实现我想要的-避免堆和运行时初始化。一切都是const
  • 我使用了另一个成员-包含sizeof的const值

代码:

class Base {
public:
  Base( uint32_t const * arr, uint32_t const sz ) : 
      m_arr( arr ), 
      m_sizeof_arr( sz ) {}

  void work() {
    for( int idx = 0; idx < m_sizeof_arr; ++idx ) {
      std::cout << "val: " << m_arr[idx] << std::endl;
    }
  }
private:
  uint32_t const * m_arr;
  uint32_t const m_sizeof_arr;
};

uint32_t const c_arr_derived1[] = { 1, 2, 3 };
class Derived1 : public Base {
public:
  Derived1() : Base ( 
      c_arr_derived1, 
      sizeof( c_arr_derived1 ) / sizeof( uint32_t )  ) {}
};

uint32_t const c_arr_derived2[] = { 4, 5, 6, 7 };
class Derived2 : public Base {
public:
  Derived2() : Base ( 
      c_arr_derived2, 
      sizeof( c_arr_derived2 ) / sizeof( uint32_t ) ) {}
};

int main() {
  Derived1 d1;
  d1.work();
  Derived2 d2;
  d2.work();
  return 0;
}