我如何参考超级阶级中定义的类

How do I reference a class defined inside my superclass?

本文关键字:定义 何参考 参考      更新时间:2023-10-16

我有一个超级类,其中定义了其中的类。喜欢:

class A {
 public:
  class B {public: bool value;};
  A() {
      DoStuff(b_);
  }
  B b_;
 private:
  virtual void DoStuffImpl(B& b) = 0;
  void DoStuff(B& b) { return DoStuffImpl(b); }
};
class X : public A {
  // ...
 private:
  virtual void DoStuffImpl(B& b);
  void UseBForSomethingElse(B& b);
};
void X::DoStuffImpl(B& b) {
    UseBForSomethingElse(b);
}
void X::UseBForSomethingElse(B& b) {
    b.value = true;
}
int main(){
    X x;
    return x.b_.value;
}

我的编译器似乎知道DoStuffImpl()很好。但是,当我添加UseBForSomethingElse()时,编译器找不到B类的定义。我尝试通过执行bool UseBForSomethingElse(A::B& b)进一步指定。这是编译的,但随后在链接过程中失败。

我如何正确指定父 B,为什么它适用于虚拟函数,而不是另一个函数?

您的更新帖子不正确地符合Usebforsomethingelse()。

void UseBForSomethingElse(const B& b)

应该是

void X::UseBForSomethingElse(const B& b)

修复了这一问题后,您仍然有问题(如果我弄错了,天堂会帮助我)。

您正在从基类构造函数上触发虚拟方法,而无需派生的类饰面构造。即,usebforsomethingelse(non-virtual)是从dostuffimpl()(虚拟,pure @ a,x) x X x触发的(实际上是您,实际上您是 in X拨打电话时)。这将触发一个"纯虚拟函数",因为X的VTable直到实际输入其构造函数才固定。

dim 也发生在我的计算机上,顺便说一句。

基于OP编辑编辑:

IDEONE说您的运行时错误的原因是因为您从Main 返回1。main的任何非零返回值都将被视为失败的执行。如果您只是将返回更改为return !x.b_.value; IDEONE按预期报告成功。

原始答案:

void UseBForSomethingElse(const B& b) {
    b.value = true;
}

您无法分配为常量参考(b),因此这当然是您的问题之一。

另外,您没有使用X::限定UseBForSomethingElse的定义,因此编译器不会将其放在X的范围内,从而阻止其看到父母的嵌套类。