我正在使用的库具有类G和继承G的类S。

我需要为它们添加功能,所以我包装了G和S,而是从它们的继承中分别制造了Gnew和Snew。

所以,我的继承是:

 G --> Gnew
 |
 v
 S --> Snew

But, I want to use Gnew in Snew and when I try to include the Gnew header (in the Snew implementation file) to use it ... the include guards mask the definition of Gnew in Snew???

How can I use Gnew in Snew? Right now, the compiler wont even let me forward declare Gnew in the Snew definition file (which doesn't make sense to me) unless I forward declare inside the class.

In Snew (if I forward declare before the Snew definition) I have:

...
Gnew *g;

错误是:
error: ISO C++ forbids declaration of ‘Gnew’ with no type

如果我将Snew更改为:
...
class Gnew *g;
Gnew *g;

错误是:
error: invalid use of undefined type ‘struct Snew::Gnew’

注意:
我正在尝试抽象问题,因此我将其关闭并重新打开该问题的更好措词...

最佳答案

周期在哪里?为什么Gnew会包含Snew的 header ?

[编辑]
好的,我认为您的继承箭头与习惯相反。但这应该使您理清:

在Gnew.h中:

#pragma once
#if !defined(Gnew_h)
#define Gnew_h

#include "G.h"

class Gnew : public virtual G
{
  // added functionality here.
};

#endif // Gnew_h

在Snew.h中:
#pragma once
#if !defined(Snew_h)
#define Snew_h

#include "S.h"
#include "Gnew.h"

class Snew : public virtual Gnew, public virtual S
{
  // added functionality here.
};

#endif // Snew_h

您不必转发任何声明。

但是请注意,这仅在S继承自G的情况下才可以按预期工作。如果所有这些多重继承问题都太麻烦了,则可能应该改编库类而不是从它们继承。

这有帮助吗?

10-08 04:17