2012-11-08 39 views
0

我想在一個函數中聲明指向類的指針,並用此指針作爲參數調用另一個函數。另一個函數試圖創建類並分配指向這個新創建的類的指針來輸入指針。指針不取值

第一種方法:

size_t packetLen = 0; 
ETH2::PacketEthernetII* eth = NULL; 
IPv4::PacketIPv4* ip4 = NULL; 
ICMP::PacketICMP* icmp = NULL; 
TCP::PacketTCP* tcp = NULL; 
UDP::PacketUDP* udp = NULL; 
if (!buildPackets(formats, packetLen, eth, ip4, icmp, tcp, udp)) {} 

另一種方法:

bool Device::buildPackets(const Tokens& formats, size_t& packetLen, 
     ETH2::PacketEthernetII* eth, IPv4::PacketIPv4* ip4, 
     ICMP::PacketICMP* icmp, TCP::PacketTCP* tcp, UDP::PacketUDP* udp) 
    { 
     for (size_t i = 0; i < formats.size(); ++i) {  
       if (Utilities::startsWith(formats[i], ETH2PROTO)) {    
        eth = createEthernet2(formats[i]);   
        if (!eth) 
         return false;   
        packetLen += eth->len();    
       } 
     } 
     return true; 
} 

第二種方法是工作和ETH取值的對象。但回到第一種方法後,eth爲空...而我不知道爲什麼。 關於我錯過的指針的重要細節?

+1

通過引用傳遞指針,例如'ETH2 :: PacketEthernetII *&eth'而不是'ETH2 :: PacketEthernetII * eth'。 – ildjarn

+0

它有效,thx。但爲什麼它必須通過引用傳遞? –

+0

因爲C++按值傳遞參數。這意味着每個函數調用都會複製其所有參數,以便值中的更改不會傳播到函數之外。按引用傳遞更改此行爲不復制參數,使更改在函數外可見。 – stonemetal

回答

1

呼叫參考:

bool Device::buildPackets(const Tokens& formats, size_t& packetLen, 
    ETH2::PacketEthernetII* &eth, IPv4::PacketIPv4* ip4, 
    ICMP::PacketICMP* icmp, TCP::PacketTCP* tcp, UDP::PacketUDP* udp)