2012-11-08 2 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가 null입니다. 이유는 알 수 없습니다. 놓친 포인터에 대한 중요한 세부 사항은 무엇입니까? 참조로

+1

는, 예를 참고로 포인터 합격 'ETH2 :: PacketEthernetII * & eth' 대신에'ETH2 :: PacketEthernetII * & eth'를 사용하십시오. – ildjarn

+0

그것은 작동합니다. 그러나 참조로 전달되어야하는 이유는 무엇입니까? –

+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) 
관련 문제