【发布时间】:2012-06-18 22:28:04
【问题描述】:
在我的新工作中,我意识到迄今为止我实际使用的 C++ 技能有多么少。我现在正在通过一些自我强加的 OOP 练习而苦苦挣扎,并且被困在一系列参差不齐的类中。
代码如下:
#define CAT_ONE_COUNT 6
#define CAT_TWO_COUNT 7
#define CAT_THREE_COUNT 20
#define CAT_FOUR_COUNT 5
#define CAT_FIVE_COUNT 4
#define CAT_SIX_COUNT 20
enum {CAT_ONE, CAT_TWO, CAT_THREE, CAT_FOUR, CAT_FIVE};
class EntryList
{
private:
ScheduleEntry* catOne[CAT_ONE_COUNT];
ScheduleEntry* catTwo[CAT_TWO_COUNT];
ScheduleEntry* catThree[CAT_THREE_COUNT];
ScheduleEntry* catFour[CAT_FOUR_COUNT];
ScheduleEntry* catFive[CAT_FIVE_COUNT];
ScheduleEntry* catSix[CAT_SIX_COUNT];
ScheduleEntry** entries[];
public:
EntryList();
~EntryList();
std::string getEntry(int cat, int entry);
};
EntryList::EntryList()
{
catOne[0] = new ScheduleEntry("Pressups");
catOne[1] = new ScheduleEntry("Situps");
catOne[2] = new ScheduleEntry("Squats");
catOne[3] = new ScheduleEntry("Bench Work");
catOne[4] = new ScheduleEntry("Partner Versions");
catOne[5] = new ScheduleEntry("Running + Numbers");
entries[CAT_ONE] = &catOne;
}
显然,ScheduleEntry 是(并且成员函数是)在别处定义的,我在尝试编译时遇到的错误如下:
gfi@testbox:~/test$ g++ -o test -std=c++0x main.cpp
In file included from main.cpp:6:
EntryList.h: In constructor ‘EntryList::EntryList()’:
EntryList.h:40: error: cannot convert ‘ScheduleEntry* (*)[6]’ to ‘ScheduleEntry**’ in assignment
在阅读了我能找到的锯齿状数组之后,这是我认为实现它的最简单、最易读的方法。首先要做的事——是吗?有没有更简单的方法?
接下来(当然)编译器错误。我是怎么打错字的?
提前致谢。 =)
编辑:
找到快乐的媒介。
#define CAT_ONE_COUNT 6
#define CAT_TWO_COUNT 7
#define CAT_THREE_COUNT 20
#define CAT_FOUR_COUNT 5
#define CAT_FIVE_COUNT 4
#define CAT_SIX_COUNT 20
enum {CAT_ONE, CAT_TWO, CAT_THREE, CAT_FOUR, CAT_FIVE};
class EntryList
{
private:
ScheduleEntry** entries[6];
public:
EntryList();
~EntryList();
std::string getEntry(int cat, int entry);
};
EntryList::EntryList()
{
entries[CAT_ONE] = new ScheduleEntry*[CAT_ONE_COUNT];
entries[CAT_ONE][0] = new ScheduleEntry("Pushup");
entries[CAT_ONE][1] = new ScheduleEntry("Situps");
entries[CAT_ONE][2] = new ScheduleEntry("Squats");
entries[CAT_ONE][3] = new ScheduleEntry("Bench Work");
entries[CAT_ONE][4] = new ScheduleEntry("Partner Versions");
entries[CAT_ONE][5] = new ScheduleEntry("Running + Numbers");
}
【问题讨论】:
-
std::vector 将使管理数组内容变得更加容易。
-
@CaptainObvlious:以牺牲数据的局部性和许多不必要的分配为代价。用作矩阵的向量向量可能很好,但如果代码对性能敏感,它可能会很慢,所以测试一下。
-
@EdS。 OP 更关心加强他们的 C++ 技能,因此代码性能并不是真正的问题。
-
@CaptainObvlious:同意,只是觉得我应该提一下。
-
ScheduleEntry** entries[];在 C++ 中是非法的,您始终必须指定数组大小。我认为由于 gcc C++ 扩展,代码可以工作。
标签: c++ jagged-arrays