2016-02-21 64 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

對。我糾正了這些。謝謝。 –

相關問題