2011-12-20 2 views
3

이 비주얼 스튜디오 2010 컴파일러 (이 micrsoft 비주얼 스튜디오 2003 컴파일러와 아무 문제가 없지만)오류 C2259 : 인스턴스화 할 수 없습니다 추상 클래스

error C2259: 'user_param::UserParamB2<std::string>' : cannot instantiate abstract class due to following members: 
    'bool user_param::UserParamBase::readonly(bool)' : is abstract 
    c:\qc\qc_daq\src\hfgui3\userparambase.h(128) : see declaration of 'user_param::UserParamBase::readonly' 
    'bool user_param::UserParamBase::readonly(void)' : is abstract 
    c:\qc\qc_daq\src\hfgui3\userparambase.h(127) : see declaration of 'user_param::UserParamBase::readonly' 
    'SIZE user_param::UserParamBase::winSize(void)' : is abstract 
    c:\qc\qc_daq\src\hfgui3\userparambase.h(129) : see declaration of 'user_param::UserParamBase::winSize' 

내 소스 코드는 다음과 같습니다과 오류 메시지입니다 :

class UserParamBase : public UserParamName 
{ 
    public: 
     virtual bool readonly() =0; 
     virtual bool readonly(bool bReadonly)=0; 
     virtual SIZE winSize()=0;  
     virtual bool get()=0; 
     virtual void create(CWnd* pParentWnd,const RECT& rect)=0; 
     virtual void close()=0; 
     virtual void update()=0; 
} 

... 
template <> 
class UserParam<string> : public UserParamB2<string> 
{ 
public: 
bool get() 
{ 
    AutoCritSec acsWnd(m_csWnd, true); 
    if(m_wnd.combobox && m_wnd.combobox->GetSafeHwnd()) { 
     CString text; 
     m_wnd.combobox->GetWindowText(text); 
     this->assign((LPCSTR) text); 
    } else if(m_wnd.wnd && m_wnd.wnd->GetSafeHwnd()) { 
     char* psz=NULL; 
     string s; 
     unsigned uSize = m_wnd.wnd->GetWindowTextLength()+1; 
     try { 
      psz=new char[uSize]; 
      m_wnd.wnd->GetWindowText(psz,uSize); 
      s.assign(psz); 
     } 
     catch(...) { 
      if(psz) delete [] psz; 
      throw; 
     } 
     if(psz) delete [] psz; 
     s.erase(std::remove(s.begin(),s.end(),'\r'),s.end()); 
     this->assign(s); 
    } 
    return true; 
} 

오류 메시지는 this->assign(s); 문에서 발생한다.

+0

추상 클래스를 인스턴스화 할 수 없습니다. 컴파일러 오류 메시지가 잘못되지 않았습니다. 당신은 그것을 고칠 수 없다. –

+0

클래스에 인터페이스를 추가하여이 오류를 트리거 할 수 있다는 점에 유의하십시오. – Deanna

답변

4

코드를 게시하지 않았고 형식이 지정되지 않은 컴파일러 출력 만 있기 때문에 특정하기가 어렵습니다. 그러나 추상 메서드 readonly(bool), winSize(void)을 사용하여 클래스의 하위 클래스를 만들고 하위 클래스에서이 함수를 구현하지 않은 것으로 보입니다. 따라서 하위 클래스는 추상적으로 유지됩니다. 이러한 방법을 구현하십시오.

+0

답장을 보내 주셔서 대단히 감사합니다. – user1107855

+0

코드를 게시 중입니다 : – user1107855

+0

@Cody Grey : ix 방법을 알려주세요. 이 코드는 Microsoft Visual Studio 2003에서는 잘 컴파일되지만 2010에서는 컴파일되지 않습니다. – user1107855

4

abstract 클래스를 인스턴스화 할 수 없으며 아무도 그렇게 할 수 없습니다.

다음 중 하나를 수행 할 수 있습니다

  • class 구현하지만, 더 이상 추상적 인 수 없습니다.

  • class에서 파생시키고 모든 추상 방법을 구현하도록 어린이에게 요청하십시오. 이는 사용자가하려는 것으로 보인다.

추상 방법은 같은 모양 : 귀하의 경우에는

virtual void foo() = 0; 

를, 방법 UserParamBase::readonly(void)UserParamBase::winSize(void)는 기본 클래스에서 추상이다.

UserParamB2에서 재정의하고 구현을 제공해야합니다.

+0

인사말! 내 게시물에 답해 주셔서 감사합니다. – user1107855

+0

하지만 올바른 코드를 파악할 수 없으므로 조금만 더 도와주세요. 여기에 코드를 게시하고 있습니다. – user1107855

+0

@ user1107855 오류 메시지는 무엇입니까? –

관련 문제