c ++将项目存储到数组中

时间:2013-04-26 13:31:05

标签: c++ arrays class struct

我有这个代码,在我看来,它收到了一个名为Vehicle的项目,它必须将它存储在一个名为Node的数组中。这是与该程序的这一部分相关的代码:

void Table::process(Vehicle v, int cont) {
    char a='A'+cont;
    putVehicle(a,v);
    Node.a_v[cont]=v;
    if(cont==0) a_surt=v.rowVehicle();
}

这就是我在Table.h的私有部分上使用数组的方法:

struct Node{
    Vehicle a_v;
};

我得到的错误是:

error: expected primary-expression before '.' token

我有我需要的包含,但每次输入时都会这样:Node.a_v它给了我这个错误。 有什么建议吗?

4 个答案:

答案 0 :(得分:4)

如果要使用结构,则需要在使用之前声明Node。此外,结构需要包含一个数组(或者更好,查看 vectors 以获得更大的灵活性。)

struct Node {
    Vehicle[10] a_v; // 10 is max number of Vehicles in array
};

Node myNode;
myNode.a_v[cont] = v;

请记住,如果您希望保留此Node并在其中放入更多内容,则需要在正确的范围内声明它。例如,要让process函数向函数Vehicle之外的Node添加process,您可以这样:

void Table::process(Node n, Vehicle v, int cont) {
    char a = 'A'+cont;
    putVehicle(a,v);
    if (cont < 10) {
        n.a_v[cont] = v;
    }
    if (cont == 0) a_surt = v.rowVehicle();
}

看起来你只是想尝试使用数组。在这种情况下,你正在寻找这样的东西:

// This would go somewhere in your program. Again, 10 is just an example.
Vehicle vehicleArray[10];

// Send this array to this function
void Table::process(Vehicle[] vArray, Vehicle v, int cont) {
    char a = 'A'+cont;
    putVehicle(a,v);
    if (cont < 10) { // In a real program, don't hard-code array limits.
        vArray[cont] = v;
    }
    if (cont == 0) a_surt = v.rowVehicle();
}

答案 1 :(得分:3)

您应该使用Node对象来访问a_v变量。这一行

Node.a_v[cont]=v;

不正确。你应该这样做:

Node n;
n.a_v[cont]=v;

答案 2 :(得分:2)

  

每次我输入这个:Node.a_v它给了我那个错误。

Node是一种类型; types定义了对象的结构,但是它们没有自己的字段(static字段除外,它们同时属于所有实例;无论如何都以不同的方式访问它们。)< / p>

要使用.->运算符,您需要Node实例,如下所示:

Node x;
x.a_v = ...

但是,在您的情况下,Node实例应该从何处开始并不清楚。为了访问它们,您需要将它们作为参数传递,或者使它们静态/全局可用(不推荐)。

答案 3 :(得分:0)

好的,所以Node不是你的数组的名字。它是应该包含数组的用户定义类型的名称。但是,您的节点不包含数组。它包含一个名为a_v的Vehicle。我假设a_v应该代表一个车辆阵列。因此,您需要分配数组。像这样:

struct Node {
   Vehicle a_v[AMOUNT];
};

如果您在编译时不知道您希望数组有多大,那么必须动态分配它们,如下所示:

struct Node {
   Vehicle* a_v;
   Node() {
      a_v = new Vehicle[AMOUNT];
   }
};

如果它是动态分配的,那么它也必须被解除分配:

struct Node {
   Vehicle* a_v;
   Node() {
      a_v = new Vehicle[AMOUNT];
   }
   ~Node() {
      delete[] a_v;
   }
};

如果它是动态分配的,则需要添加复制或禁用复制的规定:

struct Node {
   Vehicle* a_v;
   Node() {
      a_v = new Vehicle[AMOUNT];
   }
   ~Node() {
      delete[] a_v;
   }

   // Disable copies (with C++11 support):
   Node(const Node&) = delete;
   Node& operator=(const Node&) = delete;

   // Disable copies (without C++11 support) by making them private and not defining them.
   private:
   Node(const Node&);
   Node& operator=(const Node&);
};

然后要访问其中一辆车,你需要这样做:

Node n;  // Declare a node, which contains an array of Vehicles
n.a_v[cont] = v;  // Copy a Vehicle into the array of Vehicles

但是,请注意,如果在此函数中声明Node实例,则它是本地的,并且一旦函数结束它将超出范围。如果要将Node实例保留在函数调用之后,则需要将Node实例声明为Table的成员。

class Table
{
   private:
      Node n;
};

最后,正如其他人所建议的那样,我强烈建议你阅读一本C ++书来学习C ++。我的个人推荐是this book(第5版,不要购买第6版或第7版 - 这些版本的作者很糟糕)。