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

Passing the name for a new object as parameter

本文关键字:参数传递 新对象 对象      更新时间:2023-10-16

我尝试编程通用状态计算机,该计算机应在构造函数中获取所有相关信息。例如。以下面的形式:

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。这是一个没有模板或其他动态元素的测试设置。这些将稍后添加。

这个问题对我来说还不清楚...
但是,如果我正确理解您的问题:
StateMachine强制器中,只需通过param
的常规数组或向量(std::vector<param>,http://www.cplusplus.com/reference/reference/vector/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];
}

因此,您想将"未来"变量名称传递给函数并使函数为您定义变量吗?抱歉,在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"]行的状态(使用字符串定义(,而不是通过新符号污染名称范围,必须应对其可见性,寿命等。