【问题标题】:Is it possible to change size of a class member buffer是否可以更改类成员缓冲区的大小
【发布时间】:2019-08-22 10:17:53
【问题描述】:

我有一个 SPI 测试类,我正在尝试使其灵活,以便用户能够更改\设置作为 SpiTest 类私有成员的 Tx 和 Rx 缓冲区的大小。
我通过const_cast 等尝试了几种方法,但编译器每次都会给出不同类型的错误。
什么是使我的SpiTest 类足够灵活以向用户提供可用于更改缓冲区大小的函数的最佳方法,或者可以只设置一次缓冲区的大小,但由客户端/用户设置。甚至在创建测试对象后初始化一次大小就足够了。

任何想法都将受到高度赞赏。
我试过了

  1. 使用 Tx_size 成员作为静态然后它抱怨 constness 1b- 使 Tx_size const 抱怨使用 SetTxSize() 方法无法设置大小。
  2. 在构造函数中初始化它不是优势。
  3. 应用 const_cast 但这仅适用于更改指针类型 consts
  4. 这是我的课:

    class SPITest
    {
      public:
      SPITest();
      ~SPITest() = default;
    
      uint8_t* GetTxBuf(void)
      {
        return &TX_m[0];
      }
    
      uint8_t* GetRxBuf(void)
      {
        return &RX_m[0];
      }
    
      uint8_t GetTxSize(void)
      {
        return Tx_Size;    
      }
    
      void SetTxSize(uint8_t size)
      {
        Tx_Size=  (size);       
     }
    
     private:
       static uint8_t Tx_Size = 6;
       uint8_t TX_m[Tx_Size]; 
       uint8_t RX_m[Tx_Size]; 
    };
    

错误如下:

错误[Pe1592]:具有类内初始化程序的成员必须是 const
错误[P​​e028]:表达式必须有一个常量值

【问题讨论】:

  • 如果您需要动态大小,请使用std::vector
  • std::vector<uint8_t> 用于TX_mRX_m
  • @πάνταῥεῖ 有一次我比你快:P
  • @以前这很容易发生,我是个老人;-)
  • 或者:template <size_t BufferSize> class SPITest { std::array<uint8_t, BufferSize> buffer; }; - 您可以在定义对象时指定大小,但在运行时无法更改。

标签: c++ spi


【解决方案1】:

使用向量

请改用std::vector - 向量是动态数组。

然后你的班级变成:

#include <vector>

class SPITest
{
public:
    //...
    void SetTxSize(size_t size)
    {
        TX_m.resize(size);
    }

private:
    std::vector<uint8_t> TX_m; 
    std::vector<uint8_t> RX_m; 
};

【讨论】:

  • 最好删除static,并且设置器应该调整向量的大小,无论哪种方式更好地使其保持一致
  • @darune 感谢您的意见,确实很有帮助。 resize 方法和 std::vector 通常会带来很多开销,使用模板解决方案似乎开销更少?
  • 你在想什么样的“开销”,@A786?
  • @A786 No, they don't。您正在考虑 push_back 或 emplace_back 时会发生什么。
  • @A786 因此,您决定std::vectorstd::array 的主要关注点应该是:允许用户更改缓冲区大小是否有意义
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
相关资源
最近更新 更多