如何在单独的行上使用“new”初始化数组?

时间:2012-04-11 21:34:26

标签: c++ arrays

我正在读一本关于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];
}

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

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

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

正如评论(和downvoters?)所说,“最佳”解决方案只是使用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.

答案 1 :(得分:0)

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

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

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

万一你想知道你的代码:

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

在这种情况下,您将itemsarr声明为指向MenuItem实例的指针数组。正如下面的悬挂式评论所指出的,除非您指定合法的数组大小,否则这本身通常仍然不是有效的语法,例如。

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

编辑:善于学习。