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 中没有任何对象作为对象。其次,如果我在 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 将只能存储一种类型的标签。所以,A<X>只能有 type 的标签XA<Z>也只能有 type 的标签Z。我不知道这个限制是否符合您的要求,因为您的要求对我来说完全不清楚。

于 2012-10-29T04:47:15.670 回答