1

1つのポインター(_ref)を使用して、さまざまなクラスタイプをポイントしたいと思います。それを使用するには、アドレス指定されたタイプにキャストする必要があります。5行目にある不完全な型のため、これを行うことはできません。Bの定義を5行目に移動すると、クラスAを定義する必要があります。

#include <iostream>
#include <vector>
#include <string>

class B;

class A{
    void *_ref;
    std::string _reft;
public:
    void setref(A &a){
        _ref=&a;
        _reft=typeid(a).name();
    }
    void setref(B &b){
        _ref=&b;
        _reft=typeid(b).name();
    }
    void test(){
        if(_ref && _reft==std::string(typeid(B).name())){
            std::cout<<"Ref to B: ";
            static_cast<B*>(_ref)->test(); //error here
        }
    }
};

class B{
    std::vector<A> a;
public:
    A A(int i){
        return a[i];
    }
    void test(){
        std::cout<<"IT WORKS!";
    }
};

int main(){
    A a;
    B b;
    a.setref(b);
    a.test();
    return 0;
}
4

2 に答える 2

2

B完了する必要のある関数の実装をクラスから移動します。ソースファイルに入れるか、:inlineの定義の後に入れてください。B

class A{
    // ...
    void test();
};

class B{
    // ...
};

inline void A::test(){
    // ...
}
于 2012-09-21T17:53:53.703 に答える
0

参照ではなくポインタを使用すると、これを行うことができます。

参照ではなくポインタを使用するには、関数定義を変更する必要があります。

次に、関数を呼び出すときに、オブジェクトのアドレスを使用します。

于 2012-09-21T17:52:51.620 に答える