我正在编写一个数据包处理器并具有以下类:
class Parser {
private:
Packet* curr_pkt;
public:
void parsePacket(unsigned char byte) {
if(byte == SyncPacket::headerVal) {
SyncPacket pkt;
curr_pkt = &pkt;
}
if(byte == SyncPacket::headerVal) {
TypeAPacket pkt;
curr_pkt = &pkt;
}
}
};
class Packet {
public:
void parseByte(unsigned char byte) {}
};
class SyncPacket : public Packet {
public:
static const unsigned char headerVal = 0x0A;
void parseByte(unsigned char byte) {
<do sync>
}
};
class TypeAPacket : public Packet {
public:
static const unsigned char headerVal = 0x0B;
void parseByte(unsigned char byte) {
<do type A decode>
}
};
int main() {
std::vector<unsigned char> chars;
<stream in characters>
Parser pktParser;
for(unsigned char byte: bytes) {
pktParser.parseByte(byte);
}
}
这似乎工作正常,实际上是我认为多态性的用途。但我的问题是:我应该担心这里使用的原始指针吗?是否有更推荐的方法通过智能指针来做到这一点?
例如,在这一行中:
if(byte == SyncPacket::headerVal) {
SyncPacket pkt;
curr_pkt = &pkt;
}
从技术上讲, pkt 在if语句之后超出了范围,因此通常它的生命周期会结束。但是因为 curr_pkt 指向它,所以它继续存在。这是一个潜在的问题,不是吗?