从函数返回结构,如何检查它是否已初始化?

sab*_*our 5 c++ null

我在C++中有以下结构:

struct routing_entry {
        unsigned long destSeq;  // 32 bits
        unsigned long nextHop   // 32 bits
        unsigned char hopCount; // 8 bits
}; 
Run Code Online (Sandbox Code Playgroud)

我有以下功能:

routing_entry Cnode_router_aodv::consultTable(unsigned int destinationID ) {    
    routing_entry route;

    if ( routing_table.find(destinationID) != routing_table.end() )
        route = routing_table[destinationID];

    return route; // will be "empty" if not found
}
Run Code Online (Sandbox Code Playgroud)

"routing_table"是一个stl :: map,定义如下:

map< unsigned long int, routing_entry > routing_table;
Run Code Online (Sandbox Code Playgroud)

我现在的问题是,当使用consultTable函数时,我想检查返回值是否实际初始化,Java伪代码中有些类似(因为我来自Java阵营):

Route consultTable(int id) {
    Route r = table.find(id);
    return r;
}
Run Code Online (Sandbox Code Playgroud)

然后检查r == null

180*_*ION 15

这里有一些问题.最紧急的可能是找不到目的地ID时发生的情况.由于您没有构造函数,routing_entry并且您没有默认初始化,因此它将具有未定义的值.

// the data inside route is undefined at this point
routing_entry route;
Run Code Online (Sandbox Code Playgroud)

处理此问题的一种方法是默认初始化.这通过指示编译器用零填充结构来工作.这是从C借来的一种技巧,但它在这里运作良好.

routing_entry route={0};
Run Code Online (Sandbox Code Playgroud)

你提到你来自Java,与Java不同,结构和类成员不是初始化的,所以你应该以某种方式处理它.另一种方法是定义构造函数:

struct routing_entry
{
  routing_entry()
  : destSeq(0)
  , nextHop(0)
  , hopCount(0)
  { }

            unsigned long destSeq;  // 32 bits
            unsigned long nextHop;   // 32 bits
            unsigned char hopCount; // 8 bits
};
Run Code Online (Sandbox Code Playgroud)

另请注意,在C++中,整数和char成员的大小不是以位为单位定义的.char类型是1个字节(但是一个字节未定义,但通常是8位).这些天的长度通常是4个字节,但可以是其他值.

consultTable在初始化修复后转到您的身边:

routing_entry Cnode_router_aodv::consultTable(unsigned int destinationID )
{    
  routing_entry route={0};

  if ( routing_table.find(destinationID) != routing_table.end() )
        route = routing_table[destinationID];

  return route; // will be "empty" if not found
}
Run Code Online (Sandbox Code Playgroud)

一种说法可能是检查结构是否仍然归零.我更喜欢重构函数返回bool以指示成功.另外,为了简单起见,我总是输入dede STL结构,所以我会在这里做:

typedef map< unsigned long int, routing_entry > RoutingTable;
RoutingTable routing_table;
Run Code Online (Sandbox Code Playgroud)

然后我们传入对路由条目的引用来填充.这对于编译器来说可能更有效,但这可能与此无关 - 无论如何这只是一种方法.

bool Cnode_router_aodv::consultTable(unsigned int destinationID, routing_entry &entry)
{
  RoutingTable::const_iterator iter=routing_table.find(destinationID);
  if (iter==routing_table.end())
    return false;
  entry=iter->second;
  return true;
}
Run Code Online (Sandbox Code Playgroud)

你会这样称呼它:

routing_entry entry={0};
if (consultTable(id, entry))
{
  // do something with entry
}
Run Code Online (Sandbox Code Playgroud)