如何在 C++ 中实现方法返回类似 Java 中的对象 [关闭]

Posted

技术标签:

【中文标题】如何在 C++ 中实现方法返回类似 Java 中的对象 [关闭]【英文标题】:How to implement a method return something like Object-in-Java in C++ [closed] 【发布时间】:2012-10-29 02:36:32 【问题描述】:

我正在从 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++ 技能仍然很差,所以任何帮助都将不胜感激!

【问题讨论】:

你想错了。 C++ 简单,但它不同。忘记你在 Java 中是如何做事的,开始以 C++ 的方式学习 C++。 欢迎来到复杂且具有许多隐藏细节但无法退出的原因,因为它是名为 C++ 的最佳语言朋友。 Java 的对象都隐式继承自 Object。从理论上讲,您可以使您个人使用的所有内容都继承自某个根类(例如 Object)。接下来,Java 有完整的自动垃圾收集功能,而 C++ ......好吧,在 C++ 中,很少有人发现除了引用计数之外的任何东西都是值得的:在 C++ 中,您需要管理对象的生命周期,而不是将其留给框架来处理。您必须习惯的另一件事是对象的实例和指向对象的指针之间的区别:在 Java 中,每个重要的对象基本上都是一个指针。 C++ 与 Java 完全不同。忘记你所学的关于 OOP 和 Java 以及 pick up a good book 的一切。无论如何也要忘记设计模式。 @KerrekSB 你能告诉我解决这个问题的 C++ 方法吗?我的目的是让 A 类可以访问它的包装器 【参考方案1】:

我认为你所需要的只是一个 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);
    
;

【讨论】:

感谢您的回答!我会试一试,然后告诉你结果。但我还有一个问题:在这种情况下我可以使用共享指针而不是指针吗?更具体地说,共享指针是否可以包装 void 指针? 显然 - 我自己没用过 - ***.com/questions/4807286/… 我会使用一些不那么痛苦的东西,比如boost::any。使用 void * 会引发一些令人不安的终生问题。 更好 - 忘记所有关于 boost::any 的事情! @EtiennedeMartel 你能为我的问题写下你的答案吗?如果它有效,我会接受它:)【参考方案2】:

我不知道你的用例是什么,所以我不知道这是否能解决你的问题(如果你真的有的话):

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&lt;X&gt; 将只能拥有X 类型的标签,而A&lt;Z&gt; 将只能拥有Z 类型的标签。我不知道这个限制是否符合你的要求,因为我完全不清楚你的要求。

【讨论】:

谢谢!它看起来很有希望,但不幸的是它不适合我的设计。无论如何,它让我知道如何处理我的问题。

以上是关于如何在 C++ 中实现方法返回类似 Java 中的对象 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 模板容器中实现 erase() 方法

如何在 C++ 中实现这个数据结构

如何在 C# 中实现 3 层架构

Jupyter:如何在新内核中实现图像查看功能

如何在自定义文件浏览对话框Qt C++中实现返回和下一步按钮

在 C++ 中实现增量数组