【问题标题】:Same class as a member inside a class in C++?与 C++ 类中的成员相同的类?
【发布时间】:2022-01-03 19:28:37
【问题描述】:

抱歉,我的问题 earlier 的格式错误。这段代码是这样的:

class Bar
{
    public:
        // some stuff

    private:
        struct Foo
        {
            std::unordered_map<std::string, std::unique_ptr<Foo>> subFoo;
            // some other basic variables here
        };

        Foo foo;
};

我了解了subFoo 的基本概念。但我想知道Bar 的单个实例将只包含Foo 的单个实例,即foo 成员变量?所以 Bar 的单个实例/对象将无法在 subFoo 内映射多个 Foo

感觉好像漏掉了什么,谁能帮我分析一下?

【问题讨论】:

  • 1.是的。 2. 不,因为即使在Bar 内部的Foo 内部有一个subFoosubFoo 也是一个容器(unordered_map),它可能具有任意数量的值。
  • @yeputons 你能举一个在subFoo里面有两个元素的例子吗,这对我来说已经够清楚了,谢谢

标签: c++ class struct


【解决方案1】:

对于嵌套类定义的误解多于实际好处。在您的代码中,它确实无关紧要,我们可以将其更改为:

struct Foo {
    std::unordered_map<std::string, std::unique_ptr<Foo>> subFoo;
    // some other basic variables here
};

class Bar
{
        Foo foo;
};

Foo 现在定义在不同的范围内,不再是 privateBar。否则对当前代码没有影响。

我想知道 Bar 的单个实例将仅包含 Foo 的单个实例,它是 foo 成员变量?

是的。

那么 Bar 的单个实例/对象将无法在 subFoo 中映射多个 Foo?

subFoo 是一个包含指向Foos 的唯一指针的映射。 Bar::foo 不是由唯一指针管理的,因此如果不遇到双重释放错误,就不可能将它们放在 subFoo 中。 std::unique_ptr 可以与自定义删除器一起使用,但这里不是这种情况。因此,您不能在任何Foo::subFoo 中存储指向Bar::foo 的唯一指针。但是,您可以在 Foo::subFoo 中存储指向其他 Foos 的唯一指针。

【讨论】:

  • 只是一个小问题,FooBar 私有的,所以我想知道它是否可以从另一个 Bar 访问另一个 Foo 实例?
  • @DonBaka 任何Foo 可以访问另一个Foos 成员。另请注意,private 部分中定义的嵌套类并不像您所期望的那样私有。例如,如果Bar 有一个带有Foo 参数或返回类型的公共方法,那么该类型并不是真正的私有
  • 最后一个问题,另一个Foo 也意味着另一个Bar? (即Foo 实例数 == Bar 实例数)?
  • @DonBaka 坦率地说,这是非常基本的问题,我认为我能做的最好的就是向您推荐一本好的 C++ 书籍stackoverflow.com/questions/388242/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多