2011-10-10 5 views
0

클래스에 사용하고있는 카메라 SDK에서 함수를 변환하려고하므로 함수의 다른 부분을 개별적으로 호출 할 수 있습니다 (초기화, 캡처 이미지, 정리). 내가 변경을 시도한클래스 멤버로 참조 변수 초기화

class myClass 
{ 
private: 
type& var; 
}; 

을 :

type& var = type::init(); 

이 내가 할 때 작동하지 않습니다 난 데 문제는 다음과 같이 기능에 약간의 변수가 정의되어 있다는 점이다

type& var; 

type* var; 

및 WO 그 :

으로 하나의 함수로 모든 것을 가지고 있었지만 클래스의 개별 함수로 분해하려고하면 코드는 컴파일되지만 실행되지 않습니다. 기본적으로 내 코드에 문제가 있습니까?

편집 : 는하여 Basler의 SDK에서, 원래의 코드는 코드입니다 :

Pylon::CTlFactory *TlFactory; 

그리고 CPP 파일 :

TlFactory = &Pylon::CTlFactory::GetInstance(); 

헤더 파일에서

Pylon::CTlFactory& TlFactory = Pylon::CTlFactory::GetInstance(); 

언급했듯이, 모든 코드가 단일 함수에있을 때, 컴파일되고 잘 실행됩니다. 문제가있는 클래스 함수로 분해하십시오 ...

+0

당신이 경우 런타임 문제, 당신은 우리에게 더 많은 코드를 표시해야합니다. 마찬가지로'var'이 어떻게 초기화됩니까? – Mahesh

+0

감사합니다. Mahesh, 더 많은 코드가 추가되었습니다. –

답변

7

참조는 할당 할 수 없습니다. 클래스 멤버 객체로 참조가 있으면 생성자에서 초기화해야합니다. 당신이 공식과 똑같은 이름을 노출 할 수 있습니다 :

는 K-가면 무도회의 대답에 추가
class myClass 
{ 
public: 
    myClass(type& some_var) 
     : var(some_var) 
    {} 

private: 
    type& var; 
}; 
+0

현재 코드가 작성된 방식 (광산이 아닌)입니다. 생성자 initilisation 목록을 사용하면 너무 복잡해집니다. 두 개의 변수가있는 경우 두 번째 변수는 첫 번째 변수에 종속됩니다. 그래서 포인터에 대한 참조를 변경하려고했습니다. –

+0

@chocobo_ff : 의존성은 괜찮습니다. 클래스 멤버는 클래스 정의 (초기화 프로그램 목록 아님)의 순서로 초기화되도록 보장됩니다. – ybungalobill

+0

위대한, 해답을 주셔서 감사하지만, 내가 그것을 해결했다고 생각합니다 :) –

0

, C++ 범위 지정 규칙이 (유용, IMO) 기능을주의 :이를 위해, 당신은 생성자 초기화 목록을 사용하여 매개 변수. 이렇게하면 편리한 코드 컷 & 붙여 넣기가 가능하며 '한 번 사용'이라는 이름을 꿈꾸지 않아도됩니다. 포인터를 참조에서 변경 한 후

class myClass 
{ 
public: 
    myClass(type& var) 
     : var(var) 
    {} 

private: 
    type& var; 
}; 
0
class myClass 
{ 
public: 
    myClass() : var(Pylon::CTlFactory::GetInstance()) 
    { 
     // rest of init logic 
    } 
private: 
    Pylon::CTlFactory& var; 
}; 
+0

그 일을하는 데 문제가 있는데, 나는'IPylonDevice & Camera = * TlFactory.CreateDevice (devices [0]);',' IStreamGrabber & StreamGrabber = * Camera.GetStreamGrabber (0); 이것은'Camera'에 의존합니다 ...이 경우 어떻게합니까? 감사. –

+0

같은 일을하십시오. 클래스 선언에서'StreamGrabber' 전에'Camera'를 정의한 한 괜찮습니다. – Ayjay