Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;访问私有类成员 我正在编写一个C++类,提供缓冲池。该类包含实际(私有)池和一个公共函数,该函数返回指向空闲缓冲区的指针。类声明位于hpp文件中_C++ - Fatal编程技术网

C++;访问私有类成员 我正在编写一个C++类,提供缓冲池。该类包含实际(私有)池和一个公共函数,该函数返回指向空闲缓冲区的指针。类声明位于hpp文件中

C++;访问私有类成员 我正在编写一个C++类,提供缓冲池。该类包含实际(私有)池和一个公共函数,该函数返回指向空闲缓冲区的指针。类声明位于hpp文件中,c++,C++,CtrTransmissionBuffers.hpp class CTransmissionBuffers { public: static constexpr uint32_t buffer_length = 1000; struct Transmissionbuffer_T { osMutexId mutex; uint8_t data[buffer_le

CtrTransmissionBuffers.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];
};
#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);
    }
CtrTransmissionBuffers.cpp

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];
};
#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);
    }
到相应的cpp文件,但a无法访问n_缓冲区,因为它是私有的:(

我必须定义一个静态成员吗?你对如何解决这个问题有什么好的想法吗


向Julian问好您的语法已关闭。Transmissionbuffer\T不是类的成员,而是类的成员类型。静态定义应如下所示:

Transmissionbuffer_T CTransmissionBuffers::buffer_pool[CTransmissionBuffers::n_buffer]={};
在C++17中,可以使用内联变量作为解决此问题的更方便的方法:

class CTransmissionBuffers {
//...
private:
//...
            inline static Transmissionbuffer_T buffer_pool[n_buffer];
}
如果您将其声明为内联变量,请不要在类外部也声明该变量,否则您将有重复的定义并得到错误


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

在做了一些研究之后,发现内联变量仅在gcc 7中受支持 (见附件) 不过我还是坚持使用gcc6

我通过放置一个

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

在cpp文件的开头。这很好。非常感谢您的帮助:)

您是否将.hpp文件包含在.cpp文件中?
Transmissionbuffer\u T
似乎不是
CtrTransmissionBuffers
的成员。你的意思是说传输缓冲区CtrTransmissionBuffers::buffer\u池[CtrTransmissionBuffers::n\u buffer]={}?是的,你必须定义一个静态成员。您还没有显示cop文件,因此没有人能告诉您出了什么问题。也许现在是在类中适当的时候参考的好时机。我使用的是c++17,但当我在头文件中的变量之前放置一个内联时,我得到了一个编译错误
类CtrTransmissionBuffers{/..private://..static constexpr uint32\u t n\u buffer=3;内联静态传输缓冲区缓冲区池[n\u buffer]
产生的错误是:
错误:“缓冲池”声明为“内联”字段
您使用的编译器是什么?是否确实在启用c++17模式的情况下运行它?也可能是您的编译器还不支持内联变量。