我有一个类声明,我将多次使用Title和Values的不同值
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
类型的实例?
答案 0 :(得分:4)
目前尚不清楚String
是什么,但我将假定它与std::string
类似。
将数组作为参数传递是一个糟糕的主意。代替矢量:
void SetTitles(vector<string> names)
然后,您可以轻松地将其称为在流上创建向量,只需另外两个大括号即可:
Organ_Levels.SetTitles({"", "Rot", "Tone", "Sprd", "Bal", "Upper", "Lower", "Pedal", "Volume"}); return 0;
下一步将是在您的类中也获得该阵列的装备。然后,您可以替换for循环,以将值一一复制到向量级的简单赋值语句。
答案 1 :(得分:4)
您的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 ++类型。
答案 2 :(得分:2)
如果您使用的是C ++ 11或更高版本,则可以使用{{作为变量函数(可以传递可变数量的参数的函数))来调用SetTitles
3}}。
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[]
数组更改为parameter packs(例如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
}
感谢std::vector
。