2009-12-16 5 views
2

서브 클래스 B의 유형에 대해 수퍼 클래스 A의 유형을 확인하고 싶습니다 (수퍼 클래스 A의 메소드를 사용하여 B이이를 상속 함). 전달 선언 및 typeid

#include <iostream> 
#include <typeinfo> 

using namespace std; 

class B; 

class A { 
    public: 
    int i_; 
    void Check() { 
     if (typeid (*this) == typeid (B)) 
     cout << "True: Same type as B." << endl; 
     else 
     cout << "False: Not the same type as B." << endl; 
    } 
}; 

class B : public A { 
    public: 
    double d_; 
}; 


int main() { 

    A a; 
    B b; 

    a.Check(); // should be false 
    b.Check(); // should be true 

    return 0; 
} 

그러나이 코드는 컴파일되지 않습니다 :

는 여기에 (즉, 앞으로 선언의 사용이다) 속임수를 썼는지 생각거야. 오류는 다음과 같습니다.

main.cc: In member function ‘void A::Check()’: 
main.cc:12: error: invalid use of incomplete type ‘struct B’ 
main.cc:6: error: forward declaration of ‘struct B’ 

이 문제를 어떻게 해결할 수 있습니까?

답변

3

의 선언 후 몸 난 당신이 해결하려고하는 문제가 훨씬 더 하라고 생각 가상의 방법으로 ndled : 기본 클래스 A의

class A 
{ 
    public: 
     virtual bool Check() { return false; }; 
} 


class B : public A 
{ 
    public: 
     // override A::Check() 
     virtual bool Check() { return true; }; 
} 

방법을 개체가 "정말"는 A 또는 기본 객체 지향 설계 원칙의 위반입니다 B.인지를 알 필요가 없습니다. 개체가 B 일 때 동작을 변경해야 할 경우 B에서 동작을 정의하고 가상 메서드 호출로 처리해야합니다.

+0

기본 OOP 원칙을 위반하고 있다고 생각하지 않았습니다. 말할 것도없이 내가하려고했던 것은 효과가 없었습니다. 제안한대로 가상 기능을 사용하여 모든 것을 다시 작성했습니다. 감사합니다. – Jir

0

컴파일러가 함수 정의에 도달 할 때 B이 정의되도록 Check의 정의를 클래스 정의 밖으로 가져 오는 것이 한 가지 방법입니다.

class A { 
    //... 
    void Check(); 
    //... 
}; 
class B { /* ... */ }; 

void A::Check() { 
    //... 
} 
1

그냥() (A)의 몸에서 검사의 정의를 이동 :

#include <iostream> 
#include <typeinfo> 

using namespace std; 

class B; 

class A { 
    public: 
    int i_; 
    void Check(); 
}; 

class B : public A { 
    public: 
    double d_; 
}; 

void A::Check() { 
    if (typeid (*this) == typeid (B)) 
    cout << "True: Same type as B." << endl; 
    else 
    cout << "False: Not the same type as B." << endl; 
} 

int main() { 

    A a; 
    B b; 

    a.Check(); // should be false 
    b.Check(); // should be true 

    return 0; 
} 
+0

빠른 답변 감사합니다! 네가 제안한 것은 실제로 효과가 있었다. 그러나 나는 가상 함수의 관점에서 모든 것을 재 작성하는 것을 선호했다. – Jir

0

0

그냥 기능을 이동 클래스 B의 당신의 선언 아래의 확인의 당신의 정의를 이동 B.

#include <iostream> 
#include <typeinfo> 

struct A 
{ 
    int i_; 
    void Check(); 
}; 

struct B : A 
{ 
    double d_; 
}; 

void A::Check() 
{ 
    using namespace std; 
    if (typeid (*this) == typeid (B)) 
    { 
     cout << "True: Same type as B." << endl; 
    } 
    else 
    { 
     cout << "False: Not the same type as B." << endl; 
    } 
} 

int main() 
{ 
    A a; 
    B b; 

    a.Check(); // should be false 
    b.Check(); // should be true 

    return 0; 
} 
0

안녕, 당신은의 정의를 넣어 경우에도 은 : 당신이 무엇을 기대하지 않습니다 클래스 외부에서 결과를 확인합니다. 이것은 B 객체가 메소드의 A 객체로 변환하기 때문에 A 객체의이 점을 따라서 typeids는 항상 다릅니다. 이 문제를 해결하려면 가상 메소드를 선언하십시오.

그러나 아직도 테스트를 수행하려는 이유를 이해하지 못합니다. O_o ?? 그리고 CAdaker는 이것이 좋은 연습이 아니라고 말했다.

+0

클래스의 유형에 따라 다른 메소드를 트리거하려면이 작업을 수행하고 싶습니다. b.Check() then b.method_in_the_subclass(); else b.method_in_the_superclass(); 당신의 모든 힌트 덕분에 나는 이것을 거의 잘 볼 수 없다는 것을 알 수 있습니다. – Jir