【问题标题】:How to create an object of a derived class in a base class in c++ [closed]如何在c ++中的基类中创建派生类的对象[关闭]
【发布时间】:2016-09-11 11:42:50
【问题描述】:

您好,我正在尝试创建一个程序,但遇到了一些麻烦我有 3 个名为 Goku vegeta Beerus 的类,其中 Goku 是基类,而 vegeta 和 Beerus 从 Goku 继承我想创建一个名为 rose 的 vegeta 对象和一个对象比鲁斯在悟空内部被称为上帝,但出现错误,任何人都可以指出我将如何做到这一点,感谢所有帮助,程序如下:

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 cannot name a type 比鲁斯无法命名类型

【问题讨论】:

  • 你试过“橡皮鸭调试”吗?当你打线GokuBlack* rose; 你知道GokuBlack 是什么吗?
  • 哦抱歉 Gokublack 是个错误应该是 vegeta 我会马上编辑它谢谢你指出来
  • 同样的问题也适用:当你炙手可热的Beerus* god;,你知道Beerus是什么吗?

标签: c++ class derived-class base-class


【解决方案1】:

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

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);
};

【讨论】:

  • 只是没有解释的代码转储不是一个好的答案。
  • 我正在编辑答案
【解决方案2】:

你的课堂有错误。目前,当您这样做时:

vegeta* rose;
Beerus* god;

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

class Beerus;    
class vegeta;

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


Live Example

【讨论】:

  • 使用前向声明来使用不完整的类型。但你会遇到问题我建议使用模板
【解决方案3】:

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

#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 的定义移到 A 类下,并将 B 的 print() 移到 A 下,一切正常! 因为在初始化 aObj 时,它会在上面查找并找到一个完整的 A 这是我们在使用包含类实现的头文件时使用的 所以代码变成了这样:

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
}

【讨论】:

    猜你喜欢
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 2020-08-06
    相关资源
    最近更新 更多