嵌套类的模式?[已结束]

Patterns for nested classes? [closed]

提问人:yetanotherus3r 提问时间:12/16/2022 最后编辑:yetanotherus3r 更新时间:12/16/2022 访问量:62

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

11个月前关闭。

我试图解释为什么成员类不像成员函数那样工作。

下面是一个最小的示例:

#include <iostream>

class Base
{
public:
  Base ():my_stuff ()
  {
  };

  struct Stuff
  {
    Stuff ()
    {    
        std::cout << "Base created Stuff" << std::endl;
    };
  };

  Stuff my_stuff;


};


class Derived: Base
{
public:
  struct Stuff
  {
    Stuff ()
    {
      std::cout << "Derived created Stuff" << std::endl;
    };
  };

};

int
main ()
{
  Base the_base;
  Derived the_derived;

  return (0);
}

输出:

Base created Stuff

Base created Stuff

与期望输出相比:

Base created Stuff

派生的创建内容

许多类似的示例的工作方式类似,除非我显式重载构造函数。假设我想避免这种情况,就像我的情况一样,因为我有大量的派生类。

我怀疑是否有解决方案,否则编译器可能会允许我编写“虚拟类”作为说明符,这实际上是我的目标。

我承认这听起来可能不合理,但 Python 允许它,我最近进行了切换:)

提前致谢!

编辑:评论指出问题不清楚,所以我再试一次。 相关类 A、B、C 的良好做法(或良好模式)是什么?使用组件 X、Y、Z...分别,但以同样的方式?

以迭代器为例。每个标准容器都实现自己的迭代器。因此,我的期望是存在一个通用的容器祖先,将迭代器的基类作为成员。如果是这样,它是如何完成的?

再次感谢

套的 C++ OOP 设计模式

评论

1赞 Captain Obvlious 12/16/2022
C++是C++,它不是Python或Javascript或Java或C#。不要假设或期望任何内容在 C++ 中的工作方式与在另一种语言中的工作方式相同,反之亦然。
2赞 Some programmer dude 12/16/2022
请记住,继承是一种单向关系。 is-a ,但不是 .该类知道 ,它无法知道派生类中定义的结构。DerivedBaseBaseDerivedBaseBase::Stuff
0赞 molbdnilo 12/16/2022
不能“覆盖”类型或成员变量。
1赞 463035818_is_not_an_ai 12/16/2022
我很少使用嵌套类,从不重用它们。我看到的关于嵌套类的大多数问题似乎都是关于期望嵌套类带来一些他们没有带来的优势。
1赞 Sam Varshavchik 12/16/2022
如果一个 Stuff 的长度为 10 个字节,而另一个的长度为 40 GB,那么现在不同的 Base 实例在内存中具有不同的大小。C++ 不以这种方式工作。

答:

2赞 Jarod42 12/16/2022 #1

虚拟(内部)类在 C++ 中是不可能的。

模板可能会有所帮助:

template <typename T>
struct Stuff;

template <typename Tag>
class StuffBase
{
    Stuff<Tag> my_stuff;
public:
  StuffBase() = default;
};

class BaseTag{};
class DerivedTag{};

template <>
struct Stuff<BaseTag>
{
    Stuff() { std::cout << "Base created Stuff" << std::endl; }
};

template <>
struct Stuff<DerivedTag>
{
    Stuff() { std::cout << "Derived created Stuff" << std::endl; }
};

using Base = StuffBase<BaseTag>;
using Derived = StuffBase<DerivedTag>;

演示