2014-01-30 12 views
0

나는 천천히 C++을 배우고 있지만, 프로그램에 접근하려고 할 때 문제가 생기고 객체 Ive를 만들 때 어려움을 겪고있다. 나의 목적은 내가하지만, 제비 갈매기의 파일이 'player.cpp'라고하며, '배경'접근을 필요로하는 함수를 호출하는 다른 헤더 파일을 가지고다른 클래스의 객체에 액세스하기 C++

Tilemap background; 

와 source.cpp라는 페이지에 만들어집니다 나는 그것을 정의하는 방법을 이해할 수 없다. 필자는 tilemap 클래스와 함께 헤더 파일을 포함 시켰지만, 객체는 다른 곳에서 생성 되었기 때문에 그것을 참조하는 방법을 모른다. Google은 오늘 내 친구가 아니며 검색하는 데 전혀 도움이되지 않습니다.

+2

코드는 여기에서 문제를 나타내는 데 도움이됩니다. 정확한 컴파일러 오류와 함께 ./ –

+0

은 player.cpp에서 'extern Tilemap background;'를 사용합니다. –

답변

3

Tilemap background; 

(즉 아닌 기능 블록 내부) 파일 범위 작성된 라인은 글로벌 변수 정의이다. 이라는 배경 변수에 대한 전역 데이터에 저장소를 할당합니다.

다른 C++ 소스 파일에서이 개체를 참조하려면 먼저 변수를 선언해야 컴파일러에서 해당 형식을 알 수 있습니다. 글로벌 범위에 배치

// In another .cpp file 
extern Tilemap background; 

void f() 
{ 
    background.something(); 
} 
+0

간단합니까? 당신은 저에게 많은 머리를 긁어 모으 셨습니다. 너무 많은 의미를 갖지만, 몇 시간 동안 그 일을하기 위해 모든 것을 시도했습니다.이 간단한 대답 덕분에 코드의 부분을 크게 향상시킬 수 있습니다. 고맙습니다. – Mystic

1
Tilemap background; 

(의이 source.cpp 파일의 시작 부분에 어딘가에 가정 해 봅시다)는 아마 단지 source.cpp을 내이 경우에만 기본적으로 동일한 컴파일 단위 내에서 액세스 할 수있는 전역 변수를 (선언). player.cpp에서 컴파일러는 변수 background이 있는지 알지 못합니다.

하나의 해결책은 넣어 수 :

extern Tilemap background; 

player.cpp 컴파일러가 다른 곳에서 정의 된 유형 Tilemap의 전역 변수가 있음을 알려합니다.

그러나,이 종류의의 전역 변수를 사용하여 더 나은 아이디어 피하고을 찾아 일부 멤버 함수 ("방법")를 호출하는 동안 인수의 형태 (패스) 변수/객체 "확산"을하려고합니다. 결국 오브젝트 간 통신은 OO 프로그래밍에 관한 것입니다. (이 클래스의 컨텍스트를 알고 있다면 몇 가지 구체적인 예를 제공 할 것입니다/일부 코드를 공유하는 경우 ...)

0

좋습니다 C++ 시작부터 좋은 방법을 배우고 C++ 함정을 피하십시오. C++ 전역 개체를 선언하고 사용하면 파일 전역 범위에서 선언 된 전역 개체 배경이 초기화되고 다른 파일에서 사용할 때 제대로 구성되지 않았기 때문에 매우 불쾌한 동작 및 긴 디버깅 세션이 발생할 수 있습니다. 그런 객체를 사용할 때, 그것을 B라고 부르 자. 또 다른 전역 객체 A에서 다른 파일에 A가 초기화되기 전에 B가 초기화되고 매우 불쾌한 버그가 발생하거나 운이 좋으면 충돌을 일으킬 수 있는지 확인할 수 없다. 그 해결책은 다음과 같습니다. 객체를 로컬 정적 객체, 즉 다음과 같은 함수의 로컬 객체로 만듭니다.

그게 전부입니다. 어디서나 배경을 사용하려면 getBackground()를 호출하십시오. 처음으로 호출 할 때, 배경 로컬 static은 초기화되고 사용하기 좋습니다.

일부 사람들은이 기술이 싱글 톤 디자인 패턴과 관련이 있다고 말할 것입니다. 그러나 이것은 내 의도가 아니며, 절대적으로 필요한 경우 글로벌 객체를 사용하는 적절한 방법 일뿐입니다. C++은 특히 C++ 11의 출시와 함께 훌륭한 언어이지만, 알아 두어야 할 몇 가지 함정이 있습니다. Effetive C++ 사본을 가져 와서 언어를 올바르게 사용하기 위해 알아 두어야 할 거의 모든 것을 가르 칠 것입니다.

+0

이런 종류의 지연 초기화는 때로 유용하며 정적 객체 생성과 관련된 몇 가지 문제를 피할 수 있지만 특히 프로그램이 다중 스레드 인 경우 자체 문제가 있습니다. 스레드 안전하지는 않습니다. –

+0

아직 제공 한 솔루션은 정의되지 않은 동작으로 이어지지 않으므로 권장하지 않습니다. 스레드 안전성은 또 다른 문제이며 솔루션의 어느 것도 그 문제에 적합하지 않습니다. 여전히 전역을 사용하는 방식은 틀린 것입니다. C++에서 그렇게 할 수 있기 때문에 발에서 스스로를 쏘면 안됩니다. – Imaxd

관련 문제