C++;访问私有类成员 我正在编写一个C++类,提供缓冲池。该类包含实际(私有)池和一个公共函数,该函数返回指向空闲缓冲区的指针。类声明位于hpp文件中
CtrTransmissionBuffers.hppC++;访问私有类成员 我正在编写一个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
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模式的情况下运行它?也可能是您的编译器还不支持内联变量。