如何在 C++ 中的基础 class 中创建派生 class 的对象

How to create an object of a derived class in a base class in c++

你好,我正在尝试创建一个程序,但遇到了一些麻烦,我有 3 个 classes 称为 Goku vegeta Beerus,Goku 是基础 class,我想要从 Goku 继承 vegeta 和 Beerus在 Goku 中创建一个名为 rose 的 vegeta 对象和一个名为 god 的 Beerus 对象但是我遇到错误任何人都可以指出我将如何做到这一点并且所有帮助都非常感谢该程序如下:

class Goku
{    public:
     Goku(); 
   ˜ Goku();
   string get_Name(void); 
   int get_power(void)
 // This is what i want to do but keep getting errors
   vegeta* rose;
   Beerus* god;


};
class vegeta: public Goku
{
  public:
    vegeta(); //an intitializtion constructor
 ˜ vegeta();//destructor
   string get_Name(void); 
   int get_power(void)

};
class Beerus: public Goku
{      public:
       Beerus(); //an intitializtion constructor
      ˜ Beerus();//destructor
      string get_Name(void); 
     int get_power(void)

};

注意我得到的错误是:vegeta 无法命名类型 比鲁斯无法命名类型

使用预声明class
class 定义可能位于其他地方。但是这个class可以用于指向内存区域的指针。

class Beerus;         // pre-declaring class
class GokuBlack;      // pre-declaring class

class Goku
{
public:
    Goku();
    ~Goku();

    string get_Name(void);
    int get_power(void);


    GokuBlack* rose;
    Beerus* god;
};

class vegeta : public Goku
{
public:
    vegeta(); //an intitializtion constructor
    ~vegeta();
    string get_Name(void);
    int get_power(void);
};

class Beerus : public Goku
{
public:
    Beerus(); //an intitializtion constructor
    ~Beerus();

    string get_Name(void);
    int get_power(void);
};

您的 class 有误。目前,当您这样做时:

vegeta* rose;
Beerus* god;

此时,编译器不知道 vegetaBeerus 是什么。要解决此问题,请在代码开头添加以下两行:

class Beerus;    
class vegeta;

这告诉编译器,如果上面 2 classes 之一被引用,在被完全定义之前,如在实例化中,那么编译器可以在文件的其余部分提前查找名称.


Live Example

我们不谈遏制,只谈转发声明考虑:

#include "stdafx.h"
#include <iostream>
using namespace std;


class A;
class B;

class B
{
public:
    B();
    void print() { aObj->print(); } // error
    private:
        A* aObj; // it's ok because it's declared
};

B::B()
{
    aObj = new A; // error
}

class A
{
 public:
    A(){}
    void print() { cout << "A prints" << endl; }
};

现在的解决方案:

把构造函数B的定义移到classA下,把B的print()移到A下就OK了! 因为在初始化 aObj 时它会在上面查找并找到一个完整的 A 这是我们在使用包含 classes 实现的头文件时使用的内容 所以代码变成这样:

class A;
class B;

class B
{
    public:
        B();
        void print(); // just prototype
    private:
        A* aObj;
};

class A
{
     public:
     A(){}
     void print() { cout << "A prints" << endl; }
};

B::B()
{
    aObj = new A; // correct
}

void B::print()
{
     aObj->print(); // ok
}