Я чувствую себя немного смущенным относительно C ++ Composition с перегруженными конструкторами. Я прочитал эти другие статьи Вот, Вот, а также Вот но все же чувствую, что мой вопрос немного отличается от тех. Первый был самым полезным, и я реализовал то, что там предлагалось, но у меня есть несколько вопросов о том, как использовать объект композиции.
Вот некоторые фрагменты кода:
// From temp.cpp
namespace tmp
{
typedef struct
{
unsigned long adcmemory;
uint32_t adcinputstuff;
}adconf;
class tempsensor
{
private:
double temp;
unsigned char memloc;
public:
tempsensor();
tempsensor(adconf setup)
{...}
// More stuff below
.
.
};
// From habs.hpp
#include <temp.cpp>
const tmp::adconf ex = {ADC_MEM0, ADC_INPUT_A22};
const tmp::adconf in = {ADC_MEM1, ADC_INPUT_A23};
class habs
{
public:
tmp::tempsensor extemp(tmp::adconf ex), intemp(tmp::adconf ex);
// More stuff below
};
// In main.cpp
void tempThread(habs::habs &habs_obj)
{ /*
This thread will update the internal and external temp sensor values
while the mutex is not locked. When the mutex is locked the thread
will spin wait.
*/
while(1)
{
while(!habs_obj.getMutex())
{
// This is what I expected to see but I get an error
// #302 a pointer to a bound function may only be used to call
// the function habs_obj.extemp.setTemp();
habs_obj.extemp.setTemp();
habs_obj.extemp(ex).setTemp();
habs_obj.intemp(in).setTemp();
}
}
}
Поэтому я намерен иметь две переменные типа tempsensor в классе habs и использовать перегруженный конструктор в классе temp во время создания этих объектов. Затем поток, такой как файл в main.cpp, будет постоянно обновлять временные датчики, пока мьютекс не заблокирован.
Я надеюсь, что кто-то может объяснить мне, почему я должен вызывать публичные переменные в этой версии: habs_obj.intemp(in).setTemp();
вместо этого: habs_obj.extemp.setTemp();
Также я делаю это правильно? Есть ли другой способ? Я читал о конструкторе копирования и не думаю, что это то, что мне нужно, но я тоже могу ошибаться.
Заранее спасибо!
Задача ещё не решена.
Других решений пока нет …