2013-03-04 2 views
0

나는 외부 인스턴스 개체를 변형해야하는 메서드가있는 개체가 있습니다. 나는 매개 변수에서 객체를 참조하려고 시도했으나 명확하게 작동하지 않습니다. 이것은 내가 가지고있는 것입니다 :돌연변이에 대한 개체에 대한 참조 전달 C++

내 질문은 어떻게 매개 변수 전달을 통해 Character 개체를 편집 할 수있는 인스턴스화 된 테스터 클래스를 사용할 수 있습니다. 저는 C++에서 매우 새로운데, 참조와 포인트 전달에 대한 모든 인식 가능한 정의를 읽었습니다. 단지 클릭하기를 원하지 않는 것 같습니다.

+0

참조 [초기화 목록] :) 도움이되기를 바랍니다 (http://www.cplusplus.com/forum/articles/17820/) – pauld

+1

참조 http://stackoverflow.com/questions/6576109/initialising-reference-in-constructor-c?lq = 1 – pauld

답변

3

생성자가 있어야한다 :

TesterClass::TesterClass(Character& userChar):character(userChar){}

또한 this question를 참조하십시오. - 당신은 정말 초기화를 사용해야합니다

#include <iostream> 
#include <cstdlib> 

typedef char Character; 

using namespace std; 

class TesterClass { 
public: 
    void printStuff(); 
    TesterClass(Character& userChar); 
private: 
    Character& character; 
}; 

TesterClass::TesterClass(Character& userChar):character(userChar) 
{ 
} 

void TesterClass::printStuff() { 
    cout << character << endl; 
    cout << ++character << endl; 
} 

int main() { 
    Character userCharacter = 'a'; 
    TesterClass tester(userCharacter); 
    tester.printStuff(); 
    cout << userCharacter << endl; 
    ++userCharacter; 
    cout << userCharacter << endl; 
    tester.printStuff(); 
    return 0; 
} 

출력은

내가 이전 답변/의견에 동의
a 
b 
b 
c 
c 
d 
+0

원본 개체 userCharacter는 테스트를 기반으로 초기화 목록을 통해 수정되지 않습니다. 다른 구현 방법은 무엇입니까? – user2130768

1

입니다 :

여기에 값이 수정 예제 코드의 주석을 해결하기 위해 목록을 생성자에 추가하십시오. 문제는 데이터 멤버가 초기화 목록을 통해 초기화된다는 것입니다 (이것은 생성자의 본문이 호출되기 전에 발생합니다). 귀하의 경우, 귀하는 Character&을 회원으로 보유하고 있습니다. 이것은 참조이므로 무언가를 할당 받아야합니다. 어떤 컴파일러를 사용하고 있는지 확실하지 않지만 AFAIK 코드는 컴파일하지 않아야합니다.

은 당신이 아마 같은 주-방법에 대한 참조를 전달하고 찾고있는이 시점에서

int main() 
{ 
    Character userCharacter; 

    // Notice the use of the &-operator 
    TesterClass tester(&userCharacter); 
    return 0; 
} 

것은, 당신은 Character -instance 얘기를 더 이상있어,하지만 메모리의 인스턴스의 주소 따라서 mem-address를 전달하기 때문에 실제로는 참조가 아닌 클래스에서 필요한 포인터입니다. (예를 들어, userCharacter.SomeMethod()(&userCharacter)->SomeMethod()과 동의어이고 &을 참조하고 ->을 참조하지 않습니다.

대신에, 당신은 당신의 TesterClass로 작성할 수

class TesterClass 
{ 
public: 
    void printStuff(); 
    TesterClass(Character* userChar); 
private: 
    Character* character; 
}; 

TesterClass::TesterClass(Character* userChar) 
    : character(userChar) // <- Notice the init-list 
{} 

그 방법을, 당신의 TesterClass 경우에, 당신은 userChar -instance이있는 동일한 메모리 주소를 가리키는 포인터를해야합니다.

사이드 바로 : userCharacter이 범위를 벗어나면 파괴된다는 것을 알 수 있습니다. 이 경우에는 tester이 로컬이기 때문에 실제로 문제가되지 않습니다. 그러나 포인터로 작업하는 데 익숙하지 않은 경우 - 조심성이 있어야합니다. 전달할 참조가있는 변수의 범위를 벗어나는 객체 TesterClass에 포인터를 전달하지 않도록하십시오 (클래스 멤버에 주소를 저장하고 있기 때문에). 그것은 매달려있는 포인터로 당신을 떠날 것입니다.

내가 그건 당신이

+0

당신의 솔루션은 효과가 있지만, 참조를 사용하여 Character 인스턴스를 변경할 수없는 주석은 틀린 것입니다. –

+0

아 맞습니다. 당신의 솔루션을 보았고 물론 당신 말이 맞습니다 - 인스턴스를 돌연변이시킬 수 있습니다. 나는 내 대답을 편집했다. 그것을 지적 주셔서 감사합니다. – Lavesson