嵌套结构和数组C ++

时间:2014-07-27 23:48:01

标签: c++ arrays struct

您好我正在处理C ++中的嵌套结构和数组,这里有一些背景信息:

 struct Cells // a collection of data cells lines 

     cells :: [Cell] // the cells: a location and a value 

     nCells :: Integer // number of cells in the array

     capacity :: Integer // maximum size of the array end 



struct Cell 
      location :: int // a location of data cells lines 
      value :: int // the value end Cells

我没有编译的代码(3个文件,标题,ADT实现,主要) 我如何在struct array中声明嵌套结构错误?

// Defines the  cell.h ADT interface
struct Cell;
struct Cells;


struct Cells {
    Cell cells[];
    int nCells;
   int capacity;
};

struct Cell {
   int location;
   int value;
};

//fill cells with random numbers
void initialize(Cells *rcells);

ADT实施

using namespace std;

#include <iostream>
#include <cstdlib>
#include "cell.h"

void initialize(Cells *rcells){
    for(int i = 0 ; i < rcells->nCells; i++)
   {
        rcells->cells[i].location = rand() % 100;
        rcells->cells[i].value = rand() % 1000;
    }
}

using namespace std;

#include <iostream>
#include <cstdlib>
#include "cell.h"

int main(){
    Cells *c;
    c->cells[0].location=0;
    c->cells[0].value=0;
    c->cells[1].location=0;
    c->cells[1].value=0;
    c->nCells = 2;
    c->capacity = 2;
    initialize(c);
}

2 个答案:

答案 0 :(得分:2)

原始声明失败,因为

struct Cells {
    Cell cells[];
    int nCells;
    int capacity;
};
以这种方式定义的“单元格”是一个数组,它应该有固定的大小(除非它是最后一个成员,你使用的是C99标准)。您可能认为它与

相同
Cell* cells 

但它不会在struct definition中自动转换为指针类型。

C ++做这些事情的方法是

typedef std::vector<Cell> Cells;

您的初始化功能可能是

void initialize(int ncell, Cells& cells) {
    cells.resize(ncell);
    for (Cell& cell : cells)
    {
         cell.location = rand() % 100;
         cell.value = rand() % 1000;
    }
}

你的主程序应该改变一点

int main(){
    Cells c;
    initialize(2, c);

    c[0].location=0;
    c[0].value=0;
    c[1].location=0;
    c[1].value=0;
}

如果您想要细胞计数信息,可以致电

c.size()

不需要容量变量,因为单元格总数没有上限。

顺便说一句,这不是人们通常谈论的嵌套结构。当人们说嵌套结构时,他通常意味着嵌套的结构定义。包含其他对象的对象没有什么特别之处。

答案 1 :(得分:0)

与其他一些编程语言不同,当您在C或C ++中声明一个数组时,会在您声明它的地方创建它。例如,如果将一个声明为函数局部变量,则将在堆栈上创建它。

在你的情况下Cell cells[];声明一个必须在你的类中创建的数组。因此,如果您的类具有四个元素的数组,则编译器需要为该字段的每个实例4*sizeof(Cell)字节分配,以便它可以适合实例中的数组。如果您的数组有524个元素,则需要524*sizeof(Cell)个字节。

你在这里看到问题:编译器无法猜出你的对象的大小。获取实例中每个字段的位置是有问题的,特别是如果声明两个没有大小的数组。请注意,此问题不仅限于对象字段:例如,您不能在不给出大小的情况下将数组声明为函数中的局部变量。这是因为阵列具有在创建时确定的固定大小。因此,无论您在何处创建数组,都必须提供其大小。

当您将Cell array[]写为函数参数时,您不是在创建数组,而只是获取指向它的指针,所以不给它的大小是可以的。

要解决您的问题,您必须以某种方式制作具有恒定大小的类。例如,您可以使用new[some_variable]动态分配数组,并在类中使用指针Cell *cells;。指针有一个固定的大小,你的数组将在堆上声明(不要忘记它delete[])。

备注:仅提供数组初始值设定项而不是大小有效:

int x[] = {1, 2, 4}; //creates an array of three elements