在类中设置Arduino String值

问题描述 投票:1回答:3

我有一个类声明,我会多次使用不同的标题和值的值

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++ arrays string parameter-passing
3个回答
2
投票

如果您使用的是C ++ 11或更高版本,可以使用SetTitlesparameter 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
}

感谢Christophe's prompt


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循环,将值逐个复制到矢量级别的简单赋值语句。


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 ++类型。

© www.soinside.com 2019 - 2024. All rights reserved.