2016-02-21 42 views
-3

我花了很多时间在网上寻找我的问题的答案,并没有发现任何东西。不幸的是,我一定在班上落后了。如何在C++的基类中创建派生类的对象数组?

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

我有8个文件。每个类的.h和.cpp文件。校园是基础课程,建筑物是校园派生的课程,学术和休闲课程源自建筑课程。

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

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

我可能在代码中有一些其他的错误,但我主要是想了解我在校园课程中创建学术和娱乐数组时需要做什么错误。它还表示在.h文件中使这些保密。我不想找人为我做我的工作,我只是想了解它,但截至目前,我完全无能为力。

非常感谢任何人的帮助!

+2

编译时间常量表达式必须具有可见值,所以您需要在头中设置“maxPerBuildingType”。另外,我不确定是否可以堆栈类中的初始化器和构造函数。这是一个很大的问题:你的数组与指向它的指针类型不同。这应该工作AFAIK,但只有在使用指针算术之前将指针指向派生类型。如果'sizeof(Camous)!= sizeof(Academic)','campusArray [1]'会很有趣(坏)。此外,请将您的问题中的完整错误与最短的代码一起放入:[mcve]。 –

+2

代码的哪一行是错误C2061发生?你有“休闲”课吗? 'Campus.h'中包含'Academic.h'和'Recreational.h'?但是,即使你包含它们,你也会得到循环依赖。你不能用'campusArray'和'RecreationalArray'的初始化来定义'Campus',因为他们使用的类不能在没有'Campus'的情况下被定义。您需要将它们的初始化移动到'Campus.cpp'中的构造函数定义中。 – NikolayKondratyev

+0

错误C2061发生在这两行'Campus * campusArray = new Academic [maxPerBuildingType];'和 'Campus * RecreationalArray = new Recreational [maxPerBuildingType];'。我没有在Campus.h中包含Academic.h或Recreational.h –

回答

1

不能使用的campusArrayrecreationalArray初始化类的声明像这样

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

的原因是,你需要之前Campus类和你声明AcademicRecreational类使用初始化不能这样做,因为它们从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]; 
} 

而且这可以解决,如果您从Building中删除Campus的继承,以便您的AcademicRecreational类将不依赖于Campus。然后您可以将Campus申报改为

class Campus 
{ 
public: 
    static const int maxPerBuildingType;   

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

此外,在这种情况下,不要foget包括Academic.hRecreational.hCampus.h

1

那些定义为全局函数吗?

Campus.cpp

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

是不是这些? ↓

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

对。我纠正了这些。谢谢。 –

相关问题