2013-06-08 3 views
0

class BaseA, class BaseBclass DerivedC (모두 앞으로 전달됨) 클래스가 있다고 가정합니다.기본 클래스에 대한 포인터 또는 참조 얻기

class BaseA 
{ 
public: 
    BaseA(); 
    BaseA(const BaseB&); 
}; 

class BaseB 
{ 
public: 
    BaseB(); 
    BaseB(const BaseA&); 
}; 

당신이 볼 수 있듯이

, 클래스 A와 B는 각각 다른 변환 할 수 있도록 (구 내가 발명) "대칭 호환"입니다.

class DerivedC: virtual BaseA, virtual BaseB 
{ 
public: 
    DerivedC(); 
    DerivedC(const BaseA &a): BaseA(a), BaseB(a) {}; 
    DerivedC(const BaseB &b): BaseA(b), BaseB(b) {}; 

    void A() { 
     (BaseA)*this = (BaseB)*this; 
    }; 
}; 

더 우아하고 효율적인 방법이 있는지 궁금합니다. DerivedC의 BaseA 부분을 DerivedC의 BaseB 부분과 동일하게 설정하려고합니다. 그러나이 클래스는 저수준이며 고주파수에서 사용됩니다. 최후의 수단으로 상위 수준에서만 클래스를 사용하는 것을 선호합니다.

편집 : A와 B 사이의 변환에는 아크 탄젠트와 sqrts가 포함됩니다 (그것이 무엇인지 추측 할 수 있습니까?). 그러나 나는 캐스트에서 벗어나고 싶다.

편집 : 기본 클래스에는 상속되어야하는 일부 get-set 및 연산자가 있습니다.

+0

당신은 어댑터 패턴을 구현? 어떤 종류의 메시지? 제네릭 형식 이름을 사용하여 필요한 것을 말하기는 어렵습니다. BaseA와 BaseB가 일반 오래된 데이터 클래스 인 경우,'operator ='연산은 꽤 빨라야합니다. – amwinter

+0

이러한 구문의 실제 적용에는 각각에 대해 get 및 set 함수가있는 두 개의 변수가 포함 된 클래스가 포함됩니다. Vector 클래스 (크기 및 방향 구성 요소 포함) 및 Point 클래스 (x 및 y 구성 요소 포함)로 적용됩니다. 파생 된 파생물은 두 가지 모두에 빠르게 액세스 할 수있는 방법으로 사용됩니다. 반복적으로 변환하지 않고도 – bathtub

답변

1

이유는 바로이 없습니다 :

struct Point { float x,y; }; 
struct Vector { float mag,theta; }; 
struct PointVector { 
    PointVector(const Point& p_,const Vector& v_):p(p_),v(v_) {} 
    Point p; 
    Vector v; 
}; 
+0

모든 것이 공용이지만이 클래스에 상속 된 연산자 오버로드 및 getset 함수가있는 경우 작동합니다. – bathtub

+0

상업용 또는 오픈 소스 벡터 라이브러리를 사용하는 경우 질문에 추가해야합니다. 사내에 있다면 기본 수업에 좀 더 자세히 설명해주세요. – amwinter