我有一个类声明,我会多次使用不同的标题和值的值
class Generator
{
public:
String Titles[9];
int16_t Values[9];
byte MainSel;
void SetTitles(String names[9])
{
for (i = 0; i < 9; i++)
Titles[i] = names[i];
}
void Update_Display()
{
Display(__func__, Titles, Values, MainSel);
}
};
我声明了它的一个实例并尝试使用SetTitles设置标题
Generator Organ_Levels;
Organ_Levels.SetTitles("", "Rot", "Tone", "Sprd", "Bal", "Upper", "Lower", "Pedal", "Volume");
但是编译器似乎认为我正在传递char数组:
没有匹配函数来调用'Generator :: SetTitles(const char [1],const char [4],const char [5],const char [5],const char [4],const char [6],const char [6],const char [6],const char [7])'
为什么不将它们作为Arduino String
类型的实例?
如果您使用的是C ++ 11或更高版本,可以使用SetTitles
将parameter packs称为可变参数函数(可以传递可变数量的参数)。
template<class ...Ts>
void SetTitles(Ts... args) // accepts an arbitrary number of arguments
{
std::vector<String> names {args...}; // unpacks the arguments into an initialiser list
// and constructs a vector with it
const int size = std::min(9, names.size()); // size should be no bigger than 9
// to prevent undefined behaviour
// loop through the vector as normal
for (int i = 0; i < size; i++)
Titles[i] = names[i];
}
这允许:
Organ_Levels.SetTitles("", "Rot", "Tone", "Sprd", "Bal", "Upper", "Lower", "Pedal", "Volume");
甚至更多:
Organ_Levels.SetTitles("p", "a", "r", "a", "m", "e", "t", "e", "r", " ", "p", "a", "c", "k", " ", "a", "b", "u", "s", "e");
但是,由于Generator::Titles
的大小设置为9,后一个示例仅设置最多9个标题。要使此数字动态化,请考虑将String Titles[]
数组更改为std::vector
(例如std::vector<String> Titles
)。请注意,您可能还需要更改代码的其他部分(例如int16_t Values[]
数组)。还有一个额外的好处是你可以通过直接复制向量来消除循环:
template<class ...Ts>
void SetTitles(Ts... args)
{
std::vector<String> names {args...};
// works if Titles is an std::vector
Titles = names;
// Titles = std::vector<String>{args...}; // should also work
}
目前尚不清楚String
是什么,但我认为它将类似于std::string
。
将数组作为参数传递是一个可怕的想法。转而使用矢量:
void SetTitles(vector<string> names)
然后,您可以轻松地调用它在流上创建一个向量,只需要两个括号:
Organ_Levels.SetTitles({"", "Rot", "Tone", "Sprd", "Bal", "Upper", "Lower", "Pedal", "Volume"}); return 0;
更进一步的是在你的班级中获得数组的装备。然后,您可以替换for循环,将值逐个复制到矢量级别的简单赋值语句。
您的SetTitles函数需要一个字符串数组,但在此行中:
Organ_Levels.SetTitles("", "Rot", "Tone", "Sprd", "Bal", "Upper", "Lower", "Pedal", "Volume");
您正在调用具有9个参数的函数。定义一个数组用你的数据填充它然后将它传递给SetTitles:
string names[9]={"", "Rot", "Tone", "Sprd", "Bal", "Upper", "Lower", "Pedal", "Volume"};
Organ_Levels.SetTitles(names);
我应该提到String不是c ++类型。