C++;对象数组的构造方法 我在C++中创建了一个类。每个对象与微控制器上的I/O引脚相对应。我可以创建一个对象数组,然后使用for循环将每个管脚设置为一个输出。我希望能够设置多个引脚的输出在同一时间。这可以通过硬件实现
我正在尝试创建一个在对象数组上工作的方法。您可以这样使用它:C++;对象数组的构造方法 我在C++中创建了一个类。每个对象与微控制器上的I/O引脚相对应。我可以创建一个对象数组,然后使用for循环将每个管脚设置为一个输出。我希望能够设置多个引脚的输出在同一时间。这可以通过硬件实现,c++,arrays,class,oop,object,C++,Arrays,Class,Oop,Object,我正在尝试创建一个在对象数组上工作的方法。您可以这样使用它: Pin myPins[] = {0,1,2}; myPins.setOuput(); class Pins : public std::vector<Pin> { public: void setOutput() { /* your code here */ } }; Pin::write_config(pin1.output_mask() | pin4.output_mask()); 基本上,我想创建一个在
Pin myPins[] = {0,1,2};
myPins.setOuput();
class Pins : public std::vector<Pin>
{
public:
void setOutput() { /* your code here */ }
};
Pin::write_config(pin1.output_mask() | pin4.output_mask());
基本上,我想创建一个在对象数组上工作的方法。可以创建这样的setOutput方法吗?如果是,如何进行?谢谢
更新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;
}
void setOutput(引脚[],int size){
易失性uint8_t*_DDR=引脚[0]。getDDR();
uint8_t_offset=0;
对于(int i=0;i
我正在名称中使用u,以便现有宏正常工作。不是很好,但是代码更少。不,你不能按照你想要的方式向经典数组添加方法。但是,您可以创建一个继承自(例如)std::vector的类,并向其添加方法,如下所示:
Pin myPins[] = {0,1,2};
myPins.setOuput();
class Pins : public std::vector<Pin>
{
public:
void setOutput() { /* your code here */ }
};
Pin::write_config(pin1.output_mask() | pin4.output_mask());
编辑:根据评论,子类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;
}
}
};
最有可能的是,您的
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);
};
不要把一切都搞得一团糟。这会让你的生活更艰难
[…]返回每个管脚[…]的偏移值的函数。然后我按位或将它们全部放在一起 所以你甚至不需要阅读步骤。既然你按位或按位,你甚至可以这样做:
Pin myPins[] = {0,1,2};
myPins.setOuput();
class Pins : public std::vector<Pin>
{
public:
void setOutput() { /* your code here */ }
};
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);
};
但是,派生一个不打算用作基类的类是危险的<代码>引脚'析构函数永远都不应该是琐碎的,我建议不要在这里进行子类化。这导致了一个非常严格的设计。在Pins类的setOutput函数中,如何访问每个Pin?我需要调用一个函数,返回向量中每个管脚的偏移值。然后我按位或将它们全部放在一起。在我的Pins类中,我没有办法销毁对象。因为它是在微控制器上使用的,所以实际上并不需要它。我不明白从vector继承的危害?这是一种快速而肮脏的方式。我对答案进行了编辑,以提供一个替代类,该类没有子类
std::vector
。在这个新类中,您可以使用mPins[i]
访问PIN。如果您需要访问私有成员,只需使用一个非成员函数(例如:setOutput(myPins)
)就可以了,您可以在Pin类中使其保持静态。我理解您的意思,我最初考虑创建一个自由函数,在该函数中输入一个Pin数组,它在数组中循环,并获取每个Pin的偏移量(我有一个获取偏移量的方法)并按位将它们相加,然后使用组合偏移量设置寄存器。我认为OO方法看起来更干净,但可能不值得使用。来源如下:因为我将要编写一系列免费方法(setInput、setOutput、setHigh、setLow等),我想尝试将它们分组在一个类中。除了切换版本(需要状态)我最新编辑的方法应该有效,我不认为切换是必要的,因为您可能不需要同时切换多个管脚。我用setOutput的新代码更新了我的问题。有没有比为每个方法编写这些块更好的方法呢?您只需要最后一个函数。然后传递一个指向所需成员函数的指针。