首页 文章

C访问私有类成员

提问于
浏览
1

我正在编写一个C类,它提供了一个缓冲池 . 该类包含实际(私有)池和公共函数,返回指向空闲缓冲区的指针 . 类声明在hpp文件中 .

CTransmissionBuffers.hpp

class CTransmissionBuffers {
    public: 
        static constexpr uint32_t buffer_length = 1000;
        struct Transmissionbuffer_T
        {
            osMutexId mutex;                
            uint8_t data[buffer_length];    
            osThreadId thread_id;           
        };

        CTransmissionBuffers();
        virtual ~CTransmissionBuffers();

        static bool Init_Transmission_Buffers();
        static Transmissionbuffer_T* Get_New_Transmission_Buffer();     
        static void Free_Transmission_Buffer(Transmissionbuffer_T* pBuffer);

    private:
        static constexpr uint32_t n_buffer = 3;
        static Transmissionbuffer_T buffer_pool[n_buffer];
};

CTransmissionBuffers.cpp

#include <CTransmissionBuffers.hpp>



CTransmissionBuffers::Transmissionbuffer_T buffer_pool[CTransmissionBuffers::n_buffer] = {}; /// this causes the problem

    CTransmissionBuffers::CTransmissionBuffers()
    {
        // TODO Auto-generated constructor stub

    }

    CTransmissionBuffers::~CTransmissionBuffers()
    {
        // TODO Auto-generated destructor stub
    }

    bool CTransmissionBuffers::Init_Transmission_Buffers()
    {
        for (uint32_t i = 0; i < n_buffer; i++)
        {
            buffer_pool[i].mutex = osMutexCreate(nullptr);

            if (nullptr == buffer_pool[i].mutex)
            {
                return false;
            }
        }

        return true;
    }

    CTransmissionBuffers::Transmissionbuffer_T* CTransmissionBuffers::Get_New_Transmission_Buffer()
    {
        Transmissionbuffer_T* pBuffer = nullptr;

        for (uint32_t i = 0; i < n_buffer; i++)
        {
            if (osOK == osMutexWait(buffer_pool[i].mutex, 0))
            {
                //Mutex  erhalten
                pBuffer = &(buffer_pool[i]);
                break;
            }

        }

        return pBuffer;
    }


    void CTransmissionBuffers::Free_Transmission_Buffer(Transmissionbuffer_T* pBuffer)
    {
        if(nullptr == pBuffer)
        {
            return;
        }
        osMutexRelease(pBuffer->mutex);
    }

在编译之后我得到了一个未定义的buffer_pool引用,所以我尝试添加一个

CTransmissionBuffers::Transmissionbuffer_T buffer_pool[CTransmissionBuffers::n_buffer] = {};

到相应的cpp文件但是无法访问n_buffer,因为它是私有的:(

我是否必须定义静态成员?你有一些好主意如何解决这个问题?

迎接朱利安

2 回答

  • 2

    在做了一些研究之后,事实证明只有gcc 7支持内联变量(参见https://gcc.gnu.org/projects/cxx-status.html)但是我坚持使用gcc6 .

    我通过放置一个来初始化缓冲区

    CTransmissionBuffers::Transmissionbuffer_T CTransmissionBuffers::buffer_pool[n_buffer] = {};
    

    在cpp文件的开头 . 接缝工作 . 非常感谢你的帮助 :)

  • 0

    您的语法已关闭 . Transmissionbuffer_T不是您 class 的成员,但是您 class 成员的类型 . 静态定义应如下所示:

    Transmissionbuffer_T CTransmissionBuffers::buffer_pool[CTransmissionBuffers::n_buffer]={};
    

    在C 17中,您可以使用内联变量作为解决此问题的更方便的方法:

    class CTransmissionBuffers {
    //...
    private:
    //...
                inline static Transmissionbuffer_T buffer_pool[n_buffer];
    }
    

    如果您将其声明为内联变量,请不要在类外部声明该变量,否则您将拥有重复的定义并获得错误 .

    注意:constexpr静态成员是隐式内联的,因此不需要为n_buffer正常工作做任何事情 .

相关问题