0

我正在读一本关于 C++ 的书。我想我应该练习一些我所知道的。所以我创建了一个类,它包含一个classname * name[]我稍后会分配的成员,new因为我不知道它需要多少空间。因此,当我尝试键入时name = new classname[capacity /* a variable passed in constructor */],它不起作用。现在想来,这很有道理。我参考了我的书,我意识到这name&name[0]. 这解释了为什么我的 IDE 说“表达式必须是可修改的左值”。所以现在我的问题是,如何在一行上声明一个数组,然后new在另一行上分配它?我也想知道为什么type * name[]作为班级成员有效,但不在班级之外?

class MenuItem
{
public:
    MenuItem(string description):itsDescription(description) {};
    void setDescription(string newDescription);
    string getDescription() const;
private:
    string itsDescription;
};

void MenuItem::setDescription(string newDescription)
{
    itsDescription = newDescription;
}

string MenuItem::getDescription() const
{
    return itsDescription;
}

class Menu
{
public:
    Menu(int capacity);
private:
    MenuItem * items[];
};

Menu::Menu(int capacity)
{
    items = new MenuItem("")[capacity];
}

任何帮助深表感谢。

4

2 回答 2

4

与 Java 不同,MenuItem* items[]它不是正确的类型,并且只允许在三种情况下使用,并且您不会在任何一种情况下使用它。从您的其余问题来看,我假设您想要一个动态大小的MenuItem项目数组。在这种情况下,您的成员应该只是MenuItem* items;. 然后你可以分配那个对象的数组没问题。

int capacity = 4;
items = new MenuItem[capacity]; //these are default initialized

正如评论(和反对者?)所说,“最佳”解决方案只是使用一个std::vector<MenuItem> items成员,并让它自动为您处理分配和解除分配。

有教育意义但不是很重要:
在 C++ 中,唯一可以使用空括号[]的时间是:

// as array parameters (don't be fooled, this is actually a pointer)
void myfunction(int array[]) 

// as local array defintion BUT ONLY WHEN IMMEDIATELY ASSIGNED VALUES
int array[] = {3, 6, 1};

// as the last member of an extensible object, for a C hack.

struct wierd {
    int array[];  // effectively a zero length array
};
wierd* dynamic = malloc(sizeof(wierd) + capacity*sizeof(int));

// don't do this in C++
// Actually, I think this is technically illegal as well, 
// but several compilers allow it anyway.
于 2012-04-11T21:47:12.850 回答
0

在 C 中,数组由其第一个元素的地址引用。你会注意到一个指针引用了一个地址......

MenuItem * items;
items = new MenuItem[size];

在这种情况下,items 是指向一个或多个 MenuItem 实例的指针。在这种情况下,C++ 也是如此。这是一个简化版本,如果您想将指向数组的指针作为参数传递,还需要考虑其他复杂性,但我相信您会在到达那里时弄清楚这些。

以防万一您想知道,使用您拥有的代码:

MenuItem * itemsarr[];   // invalid still because no array size

在这种情况下,您将 itemarr 声明为指向 MenuItem 实例的指针数组。正如下面的附加注释所示,除非您指定合法的数组大小,否则这本身仍然不是一般有效的语法,例如。

MenuItem * itemsarr[20];  // would be valid

编辑:使学究友好。

于 2012-04-11T21:50:09.173 回答