我用C ++创建了一个类。每个对象对应一个微控制器上的I / O引脚。我可以创建一个对象数组,然后使用for循环将每个引脚设置为输出。我希望能够在同一时间将多个引脚设置为输出。这可以通过硬件来完成。
我正在尝试创建一个可以处理对象数组的方法。你可以这样使用它:
Pin myPins[] = {0,1,2};
myPins.setOuput();
基本上我想创建一个适用于对象数组的方法。是否可以创建这样的setOuput方法?如果有,怎么样?感谢。
更新1
新的非会员方法
void setOutput(Pin pins[], int size) {
volatile uint8_t* _DDR = pins[0].getDDR();
uint8_t _offset = 0;
for (int i = 0; i < size; i++) {
_offset |= pins[i].getOffset();
}
DDR_HIGH;
}
我在名称中使用_,以便我的现有宏工作。不是很好,但代码较少。
答案 0 :(得分:2)
不,您不能按照预期的方式向经典数组添加方法。但是,您可以创建一个继承自std::vector<Pin>
的类,并向其添加方法,如下所示:
class Pins : public std::vector<Pin>
{
public:
void setOutput() { /* your code here */ }
};
这样,使用C ++ 11的统一初始化,您可以使用类似的语法:
Pins myPins = {0, 1, 2};
myPins.setOutput();
编辑:根据评论,子类STL容器是一个快速而肮脏的解决方案,而不是最好的主意。但是,您可以非常简单地创建自己的包装类:
class Pins
{
std::vector<Pin> mPins;
public:
Pins (std::initializer_list<Pin> pins) : mPins(pins)
{ }
void setOutput()
{
cout << "Pins in this pinset:" << endl;
for (Pin & p : mPins)
{
cout << "\t" << p << endl;
}
}
};
完全相同:
Pins myPins = {0, 1, 2};
myPins.setOutput();
答案 1 :(得分:0)
您的setOutput
成员函数很可能正在读取一些可能的多字节值,根据引脚更改位,然后将其写回。
C ++数组不具备成员函数。
要达到类似的效果,您应该拆分原始setOutput
正在执行的工作:
然后,您可以让多个引脚在应用最终输出之前进行纠缠。
示例:
Pin::Config cfg = Pin::read_config();
// the following could also happen in a loop over an array.
cfg = pin1.enableOutput(cfg);
cfg = pin4.enableOutput(cfg);
// or pass by reference and mutate, if you
// want a less functional style
// e.g. pinN.enableOutput(cfg)!
Pin::write_config(cfg);
这样你仍然有很好的封装,但更好的控制。然后,如果需要,您可以编写一个自由函数来操作数组,向量或任何引脚集合:
template<typename It>
void setOutputPins(It start, It end) {
Pin::Config cfg = Pin::read_config();
for (; start != end; ++start) {
cfg = (*start).enableOutput(cfg);
}
Pin::write_config(cfg);
};
将它与C数组一起使用:
Pin array[5]; // or a pointer for dynamic arrays
// ...
setOutputPins(array, array + size);
不要做所有的事情。它会让你的生活更加艰难。
[...]返回每个Pin [...]的偏移值的函数。然后我按位或者他们一起。
所以你甚至不需要那个阅读步骤。既然你是按位或者他们,你甚至可以这样做:
Pin::write_config(pin1.output_mask() | pin4.output_mask());
你也可以使函数通用:或传递一个成员函数指针:
template<typename It>
void setPins(It start, It end, Pin::Config (Pin::*fn)(void)) {
Pin::Config cfg = 0; // identity for bitwise or
for (; start != end; ++start) {
cfg |= ((*start).*fn)();
}
Pin::write_config(cfg);
};
并传递指向要调用的成员函数的指针:
setPins(array, array + size, &Pin::asInput);