gpt4 book ai didi

c++ - 通过 C++ 中的标准迭代器将基类转换为派生类

转载 作者:行者123 更新时间:2023-11-30 02:47:57 25 4
gpt4 key购买 nike

在我的程序中,我有基本的 GeneralHeader、从 GeneralHeader 和 NetworkPacket 派生的 MacHeader,其成员 Headers 是 GeneralHeader 的标准列表:

//Packet.h

enum HeaderType_t {General_Header_type, MAC_Header_type};

class GeneralHeader {
public:
bool Valid;
HeaderType_t HeaderType;
void PrintMe();
};

struct MACHeader: public GeneralHeader {
long unsigned DestAddr:48;
long unsigned SourceAddr:48;
void PrintMe();
};

struct Packet_t {
list<GeneralHeader> Headers;//TODO GeneralHeader
list<GeneralHeader>::iterator it_Header; //TODO GeneralHeader
void PrintMe();
};

在实现 Packet_t 的 PrintMe() 时,应该根据 HeaderType 打印所有 header :如果有 GeneralHeader - 它将使用 GeneralHeader.PrintMe(),如果它是列表中的 MACHeader - 它将打印 MACHeader。打印我())我正在努力将 it_Header 迭代器从基本 GeneralHeader 转换为 Packet_t 方法 PrintMe() 中的派生 MACHeader:

//Packet.cpp

void GeneralHeader::PrintMe() {
std::cout << "Valid " << GeneralHeader::Valid << endl;
std::cout << "Header Type " << GeneralHeader::HeaderType << endl;
};

void HW_MACHeader::PrintMe() {

std::cout << "------------------------ " << endl;
std::cout << "---- MAC HEADER --- " << endl;
std::cout << "------------------------ " << endl;

GeneralHeader::PrintMe();

};

void NetworkPacket_t::PrintMe() {
std::cout << "Valid Packet " << NetworkPacket_t::ValidPacket << endl;

for (it_Header = Headers.begin(); it_Header != Headers.end(); it_Header++) {
switch (it_Header->HeaderType) {
case MAC_Header_type:
static_cast<HW_MACHeader*>(it_Header)->PrintMe();
break;
default:
std::cout << "default" << endl;
};
it_Header++;
};
};

错误:从类型“std::_List_iterator”到类型“MACHeader*”的无效 static_cast

感谢您的帮助。

最佳答案

理想的/正常的多态方式是:将 PrintMe() 重新定义为虚函数,这样就不需要强制转换了:

class GeneralHeader {
public:
bool Valid;
HeaderType_t HeaderType;
virtual void PrintMe();
};

class MACHeader: public GeneralHeader {
long unsigned DestAddr:48;
long unsigned SourceAddr:48;
public:
void PrintMe();
};

还使用指向 GeneralHeader 的指针 vector :

list<GeneralHeader*>::iterator it_Header;

然后你可以:

(*it_Header)->printMe();

for 循环会更简单:

  for (it_Header = Headers.begin(); it_Header != Headers.end();++it_Header)
(*it_Header)->PrintMe();

我不知道你为什么需要 it_Header 作为类的成员?它不能只是循环的本地吗?

关于c++ - 通过 C++ 中的标准迭代器将基类转换为派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22327686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com