2011-04-06 2 views
0

첫 번째 매개 변수로 개체에 대한 포인터와 같은 형식의 개체에 대한 포인터에 대한 참조를 포함하는 벡터에 대한 참조를 사용하는 메서드가 있습니다. 두 번째 매개 변수로 이 메소드 내에서 두 번째 인수가 참조하는 위치를 벡터 내의 객체로 변경하려고합니다. 그런 다음 변경된 포인터를 메서드의 호출자가 사용하게하고 새 위치를 대상으로 사용합니다. 그러나이 구현에 내 현재 시도가 실패하고 있습니다.C++에서 포인터 위치를 다른 포인터의 위치로 설정할 수 없습니다.

문제에있어서 나는 실패 값이 가리키는 설정 시도한 방법

void execute(std::vector<CanvasElement*>& elements,CanvasElement*& lastFocused) 

예에 lastFocused의 :

lastFocused = elements[0]; 
*lastFocused = *elements[0]; 

아래의 댓글에 답글 달기의 정교화 : 실패는 함수 내의 변경 사항이 해당 함수의 범위를 벗어나면 반영되지 않는다는 것입니다.

응용 프로그램의 런타임 중에 각 포인터에 저장된 주소를 인쇄하여 값이 실제로 실행 중에 설정되지만 실행 외부에서는 변경되지 않았 음을 확인할 수 있습니다. lastFocused = elements[0];가 여기에 작동해야

+4

첫 번째가 올바르게 보입니다. –

+2

컴파일러 오류가 발생했거나 포인터가 변경되어 함수가 외부에 반영되지 않았습니까? 즉, 무엇이 실패하고 있는지 자세히 설명해 줄 수 있습니까? – Naveen

+0

나는 정교를 추가했습니다. – XBigTK13X

답변

0

포인터에 대한 참조를 벡터에 저장하고 저장된 참조를 업데이트하여이 문제를 해결할 수있었습니다. 왜 직접 설정하지 않았는지 모르지만이 해킹으로 인해 작업이 완료되었습니다.

2

할당이 데모입니다 : 그런데

#include <iostream> 
#include <string> 
#include <vector> 

typedef std::string CanvasElement; 

void execute(std::vector<CanvasElement*>& elements, CanvasElement*& lastFocused) 
{ 
    lastFocused = elements[0]; 
} 

int main() 
{ 
    std::string a = "hello"; 
    std::string b = "world"; 

    std::vector<std::string*> vec; 
    vec.push_back(&a); 
    vec.push_back(&b); 

    std::string* p = 0; 
    execute(vec, p); 
    if (p == &a) 
    { 
     std::cout << "It worked :-)\n"; 
    } 
    else 
    { 
     std::cout << "It did not work :-(\n"; 
    } 
} 

, 다음의 서명이 더 나을 것이라고 주장 할 것이다 사람들이 :

입니다
CanvasElement* lastFocusedCanvasElement(std::vector<CanvasElement*>& elements) 

, 포인터 변수를 변경하는 대신 포인터 값을 리턴해야합니다.

+2

맞아, 나는 마지막 의견에 동의한다. 나는 인수를 참조로 전달하는 것보다 포인터를 반환하는 것이 더 좋은 선택이라고 생각한다. –

+0

이 방법이 더 나은 방법이라는 데 동의하지만 현재 작동중인 시스템에서이 동작의 구현을 실제로 설치하지 못하게합니다. – XBigTK13X

관련 문제