입니다 :
여기에 값이 수정 예제 코드의 주석을 해결하기 위해 목록을 생성자에 추가하십시오. 문제는 데이터 멤버가 초기화 목록을 통해 초기화된다는 것입니다 (이것은 생성자의 본문이 호출되기 전에 발생합니다). 귀하의 경우, 귀하는
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
에 포인터를 전달하지 않도록하십시오 (클래스 멤버에 주소를 저장하고 있기 때문에). 그것은 매달려있는 포인터로 당신을 떠날 것입니다.
내가 그건 당신이
참조 [초기화 목록] :) 도움이되기를 바랍니다 (http://www.cplusplus.com/forum/articles/17820/) – pauld
참조 http://stackoverflow.com/questions/6576109/initialising-reference-in-constructor-c?lq = 1 – pauld