2013-09-25 2 views
1

최근에 STM32F103 마이크로 컨트롤러 용 C++ 학습을 시작했고 STM32plus라는 라이브러리를 사용하고 있습니다. 문제는 C++과 포인터에 전혀 익숙하지 않은 점이며이 라이브러리는 사실상이 라이브러리에 의존합니다.클래스 포인터로 프로젝트 분할하기

그래서 현재 모든 코드가있는 소스 파일이 하나 있는데,이를 섹션으로 분할하려고합니다. 내 주요 소스 파일의 상단에,이 같은 선언이 있습니다

#include "config/stm32plus.h" 
#include "config/display/tft.h" 

using namespace stm32plus; 
using namespace stm32plus::display; 

typedef Fsmc16BitAccessMode<FsmcBank1NorSram1> LcdAccessMode; 
typedef SSD1289_Landscape_64K<LcdAccessMode> LcdPanel; 

LcdAccessMode *_accessMode; 
LcdPanel *dsp; 
Font *font; 

이 더 많은,하지만 그것은 (SD 카드 및 기타 구성 요소에 대한 더있다,이 섹션이 표시입니다) 그런 일을 보인다. 나는 여기서 무슨 일이 벌어지고 있는지 대부분 잘 알고있다. 이 파일 내 기능 중 하나는 다음과 같습니다

template <class T> 
void print(T text) 
{ 
    textx+=dsp->measureString(text); 
    *dsp<<Point(textx,texty)<<text; 
} 
void println() 
{ 
    textx=0; 
    texty+=font->getHeight()+1; 
} 
template <class T> 
void println(T text) 
{ 
    print(text); 
    println(); 
} 

을 지금, 나는 시도하고 별도의 파일 또는 클래스 (Print.cpp 및 Print.h)로이 이동하고 싶어하지만, 다른 모든 종류의 시도 후 모든 라이브러리, forward 선언문을 포함하는 extern 클래스와 같은 것들, 그리고 내가 그 코드를 컴파일하려고 시도하고있는 10 가지의 다른 에러에 대한 검색을 수행 한 후에, 나는 무엇을 하려는지 인터넷 검색을 통해 간단히 찾을 수 없습니다. 나는 내가 시도한 것에 대한 예제를 게시 하겠지만 이전의 모든 시도는 삭제했으며 어쨌든 전혀 작동하지 않았다.

그래서, 주 프로그램이 디스플레이 기능을 사용하도록 허용하면서 주 프로그램에서 사용할 수 있도록 이러한 기능을 별도의 파일/클래스에 넣는 방법에 대한 예제를 제공 할 수 있습니까?

도움/조언을 보내 주시면 감사하겠습니다. 상기
: 나는 C++ 여전히 새로운 해요, 이것은 임베디드 시스템, 그래서 RAM이 제한되는 템플릿 기능에 대한

+0

템플릿 클래스의 정의는 인스턴스화 된 곳에서 확인해야합니다. 그것들을 별도의 편집 단위로 옮길 수는 없습니다. –

+0

@ g-makulik 그게 무슨 뜻인지는 모르겠지만 'typedef'라인을 언급하고있는 것 같습니다. 나는 그것을 할 수있는 방법이 있다고 확신한다. 저자는 "LcdManager"와 "ImageTransitionAnimator"와 같은 여러 파일을 가진 정말 복잡한 응용 프로그램을 만들었다. 어떻게 완료되는지 보겠지 만, 코드가 너무 복잡하고 따라하기가 복잡합니다. 템플릿 클래스를 모든 클래스에서 사용할 수 없게 만들 수있는 방법이 있습니까? –

답변

1

(I는 표시 객체/클래스의 다른 인스턴스를 만들 수 없습니다) 참고 파일에서 템플리트 특수화를 사용할 때 템플리트 함수의 정의가 표시되어야합니다.

  1. 당신은 헤더 파일의 템플릿 함수의 정의를 작성하고, 이러한 기능이 사용되는 모든 .CPP 파일에서이 헤더 파일을 포함 : 당신은 두 가지 가능성을 가지고 있음을 달성하기 위해.

  2. 템플릿 함수 전진 선언 (정확한 구문은 thread 참조)이라고하는 모든 유형에 대해 템플릿 함수의 전달 선언을 작성합니다. 파일 범위 포인터에 관한

:
당신이 당신의 인쇄 기능이 print.cpp에 있어야하고 dsp 포인터를 사용하려는 경우, 당신은 그 포인터가 볼 수 있도록 할 필요가있다.

1) 두 번째 매개 변수를 print()LCDPanel * (좋은 해결책)에 추가하십시오. 이 방법으로 함수 선언을 읽는 모든 사람들은 print() 함수가 LCDPanel을 사용하고 있으며 어떤 전역 변수가 사용되는지 찾기 위해 함수 정의를 읽을 필요가 없다는 것을 알고 있습니다.

2) 확인합니다) LCDPanel 포인터 세계 및 print.cpp (나쁜 솔루션에 따라서 볼 수 :

/* main.cpp */ 
LcdPanel *dsp; 

/* main.h */ 
#include "config/stm32plus.h" 
#include "config/display/tft.h" 

using namespace stm32plus; 
using namespace stm32plus::display; 

typedef Fsmc16BitAccessMode<FsmcBank1NorSram1> LcdAccessMode; 
typedef SSD1289_Landscape_64K<LcdAccessMode> LcdPanel; 
extern LCDPanel *dsp; 

/* print.cpp */ 
#include "main.h" 

(그런데 dsp 디지털을 위해 사용되기 때문에, dsp이 디스플레이를 지정할 수있는 좋은 이름이 아닙니다 임베디드 세계의 신호 처리)

+0

감사! 가독성 문제 외에도 LcdPanel 전역을 나쁜 해결책으로 만드는 다른 이유가 있습니까? –

+0

효과가있었습니다! 링커가 존재하지 않는 함수에 대한 이상한 오류를 주었기 때문에 템플릿을 제거해야했습니다.) 마침내 프로젝트를 다시 빌드 할 수 있습니다! 또한, 아마 dsp의 이름을 lcd 또는 다른 이름으로 바꿀 것입니다. –

+0

@LaurensWeyn 다행입니다. 전역 변수 솔루션의 경우 가독성 때문에 나쁘다는 것을 의미했습니다. –