如何在 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<X>
将只能拥有X
类型的标签,而A<Z>
将只能拥有Z
类型的标签。我不知道这个限制是否符合你的要求,因为我完全不清楚你的要求。
【讨论】:
谢谢!它看起来很有希望,但不幸的是它不适合我的设计。无论如何,它让我知道如何处理我的问题。以上是关于如何在 C++ 中实现方法返回类似 Java 中的对象 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章