【问题标题】:C++ How to Refer to a Class' Members' Members Without Accessing Original MemberC++如何在不访问原始成员的情况下引用类\'Members\'成员
【发布时间】:2022-08-17 12:26:46
【问题描述】:

嗨,我知道标题有点难以理解,那只是因为我不知道如何表达这个问题。幸运的是,我可以为我的问题提供一个易于理解的示例。想象一个基本的class A 派生的class B 和不相关的class C 设置如下:

class A
{
public:
};

class B : public A
{
public:
    C c;
};

class C
{
public:
   void foo();
};

我想知道如何在不这样做的情况下使用class B 的对象调用foo()

B b;
b.c.foo();

而是这个:

B b;
b.foo();

此外,我不想从class C 继承或复制class C\'s 函数。这可以通过简单的实现吗?谢谢!

  • 您的示例无法编译。 prog.cpp:4:2: error: 类定义后预期的';' } ^ ; prog.cpp:9:5: 错误:‘C’没有命名类型 C c; ^ prog.cpp:10:2: error: 类定义后预期的';' } ^ ; prog.cpp:16:2: error: 类定义后预期的';' } ^ ;
  • 简短的回答是,没有简单的方法可以做到这一点。关于“和不相关的 C 类”,那是不正确的。 C 参加一个作品与 B 的关系。此外,A 类是完全地与您易于理解的示例中的宗教裁判所无关,因此尚不清楚为什么它甚至存在。您的示例可能完全忽略了它。
  • @ 273K 哦,我的错,我忘记了类右括号后的分号。这是一个示例,而不是实际代码。
  • 没有帮助。 prog.cpp:9:5: 错误:‘C’没有命名类型 C c;
  • 如果没有继承,最好的办法是将void B::foo() 实现为{ this->c.foo(); },这并不完全是类C\ 的函数的副本。

标签: c++ oop inheritance alias type-erasure


【解决方案1】:

您的约束意味着您的示例没有意义,除非函数 foo 是静态的;如果不是,那么您需要在foo 有意义之前提供有关您正在使用的C 实例的信息;所以提到c 是必不可少的。如果它是静态的,则 C::foo 有效,但 b.foo() 无效。如果你想要一个调用b.c.foo()B 的成员函数,那么你应该按照上面的建议编写一个。

也许您打算在 B 中私下继承 C:

class B : private C , public A
{
public:
using C::foo;
};

会成功的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 2021-10-20
    • 2010-11-05
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多