0

私はJavaのバックグラウンドからC++を学んでいますが、これは私が出会ったばかりの問題です:

A という名前のクラスがあるとします。AWrapper というラッパーを使用します。A には、AWrapper だけでなく、任意のラッパーへのリンクが必要です。したがって、Javaでは、これを次のように実装できます。

public class A {
    Object tag;
    Object getTag() {
        return tag;
    }

    void setTag(Object tag) {
        this.tag = tag;
    }
}

およびそのラッパー:

public class AWrapper {
    A a;
    public AWrapper(A a) {
        this.a = a;
        a.setTag(this);
    }
}

しかし、C++ ではすべてがそれほど単純ではありません。まず、C++ には Java の Object として何もありません。第 2 に、getTag() の戻り値として Object ではなく AWrapper を使用すると、循環依存の問題が発生します。誰でもこれを解決する方法を教えてもらえますか?

私の質問がばかげている場合は本当に申し訳ありません。私の C++ スキルはまだ貧弱なので、助けていただければ幸いです。

4

2 に答える 2

2

必要なのはvoidポインターだけだと思います-これはコンパイルされますが、私はそれをいじっていません:

class A
{
public:
    void *tag;
    virtual void *getTag()
    {
        return tag;
    }

    virtual void setTag(void *tag)
    {
        this->tag = tag;
    }
};

class AWrapper
{
public:
    A *a;
    AWrapper(A *a)
    {
        this->a = a;
        a->setTag(this);
    }
};
于 2012-10-29T02:58:49.060 に答える
1

私はあなたのユースケースが何であるかわからないので、これがあなたの問題を解決するかどうかはわかりません(実際に問題がある場合):

template<typename TagT>
class A
{
    TagT* ptag_;
public:
    A() :ptag_() {}

    TagT& getTag() { return *ptag_; }

    void setTag(TagT& tag) { ptag_ = &tag; }
};



class AWrapper
{
    A<AWrapper> a_;
public:
    AWrapper(A<AWrapper> a) {
        a_ = a;
        a_.setTag(this);
    }
};

ただし、この場合、A クラスは実際にはクラスではありません。クラスのテンプレートです。A の各タイプは、1 つのタイプのタグのみを格納できます。したがって、A<X>は type のタグのみを持つことができX、 type のタグA<Z>のみを持つことができZます。あなたの要件は私にはまったく不明であるため、この制限があなたの要件に合っているかどうかはわかりません。

于 2012-10-29T04:47:15.670 に答える