将新对象的名称作为参数传递

时间:2018-02-10 15:43:16

标签: c++

我尝试编写一个通用状态机,它应该在构造函数中获取所有相关信息。例如。在下面的表格中:

StateMachine stateMachine =
{
    {"state1", 1.5f, 4, 'c'},
    {"state2", 5.3f, 2, 'z'}
};

StateMachine的构造函数采用initializer_list。 Param是一个包含所有信息的结构。

//constructor
StateMachine(std::initializer_list<param> il) 
{
    test = new param[il.size()];
    for (size_t i = 0; i < il.size(); i++)
        test[i] = *(il.begin() + i);
}

结构看起来像这样:

struct param
{
    float f;
    int i;
    char c;
    PassTest *test = nullptr;

    param() 
    {
        std::cout << "WHY" << std::endl;
    }

    param(std::string pass, float f, int i, char c) : test(new PassTest(pass)), f(f), i(i), c(c)
    {
        std::cout << f << '\t' << i << '\t' << c << std::endl;
    }
};

到目前为止,我可以将信息{"state1", 1.5f, 4, 'c'}存储在param的一个对象中。但我想用一个param对象的名称替换字符串“state1”,这样我就可以使用StateMachine构造函数中定义的名称直接访问该对象。 为了让你了解它应该是什么样子。

StateMachine stateMachine =
{
    {State1, 1.5f, 4, 'c'}, //State1 and State2 is no longer a String
    {State2, 5.3f, 2, 'z'}
};

你知道怎么做吗?

PS。这是一个没有模板或其他动态元素的测试设置。这些将在稍后添加。

2 个答案:

答案 0 :(得分:0)

这个问题对我来说还不清楚...... 但如果我理解你的问题:
StateMachine构造函数中,只需传递param的常用数组或向量(std::vector<param>http://www.cplusplus.com/reference/vector/vector/

std::vector<param> prlist;
prlist.push_back(param("State1", 1.5f, 4, 'c'));
prlist.push_back(param("State2", 5.3f, 2, 'z'));
StateMachine machine = StateMachine(prlist);

然后你还需要修改StateMachine类构造函数:

//constructor
StateMachine(std::vector<param> il) 
{
    test = new param[il.size()];
    for (size_t i = 0; i < il.size(); i++)
        test[i] = il[i];
}

答案 1 :(得分:0)

所以你想将一个“future”变量名称传递给一个函数,并让函数为你定义变量?对不起,这在C ++中是不可能的。你能得到的最接近的是宏。例如:

#define ADD_NAMED_ENTRY(name,value) \
  int name = (value); \
  entries.push_back(name);

int main() {
  std::vector<int> entries;
  ADD_NAMED_ENTRY(first, 1);
  ADD_NAMED_ENTRY(second, 42);
  // now the vector contains {1,42} but variables first and second also exist and have values 1 and 42, respectively
}

但是,请注意,您无法为value传递大括号初始值设定项(因为预处理器不理解其{..., ..., ...}格式并且会在逗号上中断)。您需要将其展开为ADD_NAMED_ENTRY(State1, 1.5f, 4, 'c');

在你的情况下,我宁愿建议让StateMachine保持std::unordered_map由州名而不是整数编制索引:这样你就可以使用原始代码并引用状态(使用字符串定义)沿着states["state1"]的路线,而不是用新的符号污染名称范围,不得不应对他们的能见度,生命周期等。