如何在C ++的基类中创建派生类的对象数组?

时间:2016-02-21 06:00:06

标签: c++ arrays inheritance

我花了很多时间在线寻找我的问题的答案,但没有找到任何答案。不幸的是,我必须在班上落后。

我的任务要求我建立一个校园课程,“校园必须有2个阵列的每种类型的建筑(学术,娱乐)” (这可能意味着每个建筑物每个只有一个数组。总共2个数组。其余的赋值指令有其他语法错误。)

我有8个文件。每个类的.h和.cpp文件。 Campus是基类,Building是Campus的派生类,Academic和Recreational源自Building类。

我在 Campus.h 文件中声明数组的行上收到错误 C2061

Campus.h

#pragma once

class Campus
{
public:

    Campus();
    static const int maxPerBuildingType;

    void loadFile();
    void searchList();
    void searchName();

private:

    int numberOfAcademic, numberOfRecreation;
    void Display();

    Campus * campusArray = new  Academic [maxPerBuildingType]; //Error C2061
    Campus * RecreationalArray = new Recreational[maxPerBuildingType]; //Error C2061



};

Campus.cpp(尚未实现功能)

#include "Campus.h"

#include <fstream>

using namespace std;

const int Campus::maxPerBuildingType = 7;        



Campus::Campus()
{
}

void loadFile()
{
}

void searchList()
{
}

void searchName()
{
}

Building.h

#pragma once
#include "Campus.h"
#include <string>

using namespace std;
class Building :
    public Campus
{
public:
    Building();
    Building(int _ID, string _name, string _description);

    int getID();
    void setID(int _ID);

    string getName();
    void setName(string _Name);

    string getDescription();
    void setDescription(string _Description);

    virtual void showFullDescription() = 0; 

private:
    int ID;
    string name;
    string description;
};    

Academic.h

#pragma once
#include "Building.h"
class Academic :
    public Building
{
public:
    Academic();
    Academic(int _ID, string _name, string _description, int _numOfRooms);

    int getNumOfRooms();

    void setNumOfRooms(int _numOfRooms);

    virtual void showFullDescription();

private:
    int numOfRooms;
};

我可能在代码中有其他一些错误,但我主要是想了解在我的作业需要的Campus类中制作学术和娱乐数组时我做错了什么。它还说要在.h文件中使这些私有。我不是在找人为我做我的工作,我只是想了解它,但截至目前,我完全不知道该怎么做。

提前感谢任何人的帮助!

2 个答案:

答案 0 :(得分:1)

那些被定义为全局函数吗?

Campus.cpp

void loadFile()
void searchList()
void searchName()
这些是阿伦吗? ↓

void Campus::loadFile()
void Campus::searchList()
void Campus::searchName()

答案 1 :(得分:1)

您不能在类声明中使用campusArrayrecreationalArray的初始化,如此

Campus * campusArray = new  Academic [maxPerBuildingType];
Campus * recreationalArray = new Recreational[maxPerBuildingType];

原因是要使用初始化,您需要在Academic类之前声明RecreationalCampus类,并且您不能这样做,因为它们是从Campus继承的。

但是,您可以将初始化移至.cpp文件,以便Campus.h看起来像

class Campus
{
public:
    static const int maxPerBuildingType;        

    Campus();
    void loadFile();
    void searchList();
    void searchName();
private:
    int numberOfAcademic, numberOfRecreation;
    void Display();
    Campus * campusArray;
    Campus * recreationalArray;
};

Campus.cpp成为(其他函数省略)

#include "Campus.h"
#include "Academic.h"
#include "Recreational.h"

const int Campus::maxPerBuildingType = 7;        

Campus::Campus()
{
    campusArray = new Academic[maxPerBuildingType];
    recreationalArray = new Recreational[maxPerBuildingType];
}

如果您从Campus移除Building的继承,也可以解决这个问题,这样您的AcademicRecreational类就不会依赖Campus 。然后,您可以将Campus的声明更改为

class Campus
{
public:
    static const int maxPerBuildingType;        

    Building* campusArray = new Academic[maxPerBuildingType];
    Building* recreationalArray = new Recreational[maxPerBuildingType];
};

同样在这种情况下,请不要将Academic.hRecreational.h包含在Campus.h中。