【问题标题】:How to prototyply declare an inherited class in C++?如何在 C++ 中原型声明一个继承的类?
【发布时间】:2017-04-16 18:12:38
【问题描述】:

我正在做一个项目,需要多个类,其中一些是继承的!! 所以我在定义之前在主类中使用了一个继承类! 请帮助我如何使用原型声明继承类。谢谢!!

例子:

  class A
{
  /*data*/
};
  class B:public A 
 {public:
   void func()
   {
       C obj;
   }
   };
class C:public B
{
};`

【问题讨论】:

  • 你需要展示你拥有的代码
  • 您的意思是要转发声明吗?如果是这样,前向声明产生完整类型,并且不可能从不完整类型继承。
  • @DanielCollier 现在看我写了一个例子!!
  • @RishabhSaxena 我不知道你想要什么,你不能从不完整的类型继承。您也不能实例化不完整类型的对象,您所能做的就是创建不完整类型的指针或引用的实例。
  • 不确定你想要完成什么,但无论如何你可以做的是你应该做的事情:将声明和实现分离到头文件和源文件中。在您的情况下,这将产生 6 个文件,A.h、A.cpp、B.h 等。由于 C 仅用于 B::func 的实现,因此没有问题,因为 B.cpp 将仅包含 C.h 而 B.h 将不需要C,这里没问题。

标签: c++ oop inheritance function-prototypes


【解决方案1】:

只有函数有原型。你可以对类做的就是转发声明它。

class MyFutureClass;
struct MyFutureStruct;

这是一个不完整的课程。不,C++ 中的结构与类相同,只是默认情况下它们具有公共访问权限,类具有私有访问权限。为了使它们完整,您应该在代码中进一步提供定义。

不完整的类只是一种可能的不完整类型。以下类型为不完全类型:

  • 类型无效;
  • 已声明但未定义的类类型;
  • 数组大小未知;
  • 不完整类型的元素数组;
  • 枚举类型,直到确定其基础类型。

现在你可以用不完整的类做什么?

  1. 声明一个指针变量或类字段
  2. 声明一个函数或方法,该函数或方法接受不完整类型的参数或返回,但不对其进行定义。

你不能用它做什么?

  1. 由其他类继承不完整的类
  2. 定义不完整类型的对象字段
  3. 声明不完整类型的非静态类数据成员
  4. 使用不完整的类类型作为模板参数
  5. 定义使用不完整类型参数的函数或
  6. 执行到不完整类的隐式或显式转换、隐式或显式、左值到右值的转换、标准转换、dynamic_cast 或 static_cast 到不完整类型的指针或引用,但从空指针常量或指针转换时除外to void(void* 总是可以转换,并且 void 永远不会被定义)
  7. 访问不完整类的成员或方法
  8. 使用创建不完整类型对象的新表达式
  9. 在 catch 子句中使用它
  10. 使用 typeid、sizeof 或 alignof 运算符
  11. 在指向不完整类的指针上使用算术运算符(当然,因为 sizof 是未知的)

需要什么?

  1. 当一个类依赖于另一个类的存在和功能时,为了避免头的循环依赖
  2. 减少单个文件中包含的标题数量。您可以定义获得声明类的指针和形参的类而不定义它

让我们看看,这是一个绝对没用的避免循环使用标题的例子。

[class_a.h]

class B;

class A
{
    B* p;
public:
    A ( B& value );
};

[class_b.h]

#include "class_a.h"

class B : public A   // we need complete A to inherit it
{
    int a;
public:
    B ( const B& );
};

[class_a.cpp]

#include "class_b.h"

// to define this constructor we need complete A, but header with complete 
// definition is already included within class_b.h header

A::A ( B& val) : p( new B(val))   // we created copy of B
{
}

所以,要定义类 A,我们需要类 B,但类 B 是类 A 的子类,因此它需要完整定义 A。难题?不。感谢前向声明,我们可以在不定义 B 的情况下定义 A 类。

(PS。如果有人检查了代码并发现那里不可能的东西,我的明确允许修复它是到期的......我睡着了)

【讨论】:

  • 您可以使用struct 关键字转发声明一个类,反之亦然。不是我愿意,但它完全有效。
  • @Alan Stokes 是的,我知道,只有定义阶段的访问有所不同,它们总是类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多