我在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)