在类中设置Arduino字符串值

时间:2019-03-16 11:39:09

标签: c++ arrays string parameter-passing

我有一个类声明,我将多次使用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类型的实例?

3 个答案:

答案 0 :(得分:4)

目前尚不清楚String是什么,但我将假定它与std::string类似。

将数组作为参数传递是一个糟糕的主意。代替矢量:

    void    SetTitles(vector<string> names)

然后,您可以轻松地将其称为在流上创建向量,只需另外两个大括号即可:

Organ_Levels.SetTitles({"", "Rot", "Tone", "Sprd", "Bal", "Upper", "Lower", "Pedal", "Volume"});    return 0;

Online demo

下一步将是在您的类中也获得该阵列的装备。然后,您可以替换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