Node * node [100]和Node node [100]之间有什么区别?

时间:2014-03-16 14:45:29

标签: c++ arrays pointers

我试图创建一个附属列表然后我写了这段代码:

struct No{
    int atual;
    No *prox;
    No(int n){
        atual = n;
    }       
};

No adj[101];

但是当我尝试编译它时,发生了编译错误。

然后我将此行No adj[101];更改为:No *adj[101];并且代码已成功编译。

Node *no[10]Node no[10]之间的区别是什么?

5 个答案:

答案 0 :(得分:2)

No adj[101]是一系列结构No No *adj[101]是指向结构No的指针数组。

答案 1 :(得分:1)

不同之处在于,一个声明了一个结构数组,另一个声明了一个指向结构的指针数组 - 但这不是你的问题。

这是一个更简单的例子,说明了你遇到的问题:

struct foo {
    foo(int n) {
        // nothing
    }       
};

foo obj;

以下是我从g ++获取的错误消息:

c.cpp:7:5: error: no matching function for call to ‘foo::foo()’
c.cpp:7:5: note: candidates are:
c.cpp:2:5: note: foo::foo(int)
c.cpp:2:5: note:   candidate expects 1 argument, 0 provided
c.cpp:1:8: note: foo::foo(const foo&)
c.cpp:1:8: note:   candidate expects 1 argument, 0 provided

问题是你提供了一个带有一个参数的构造函数,但是你没有提供一个不带参数的构造函数。在没有初始化程序的情况下定义类型为foo(或No)的对象需要一个不带参数的构造函数。

如果我添加如下内容:

foo() { }

在类定义中,它编译时没有错误。或者我可以从

更改对象声明
foo obj;

foo obj(42);

调用提供的构造函数。

答案 2 :(得分:0)

每个对象都应该在数组中初始化。您需要使用默认构造函数以声明方式声明对象数组。

如果你的情况下默认构造函数没有意义,你可以自己初始化每个对象,从而做出类似这样的事情No adj[101] { No(1), No(2), ..., No(101)};

答案 3 :(得分:0)

正如之前所说的那样。 No * adj [101]是一个指针数组。 但是如果你想使用构造函数初始化,可以这样做:Node adj(101)。

答案 4 :(得分:0)

No a[100]定义了100个对象的数组,而No* a[100]定义了100个指针的数组。在定义对象数组时,可以使用默认构造函数或具有默认参数的其他构造函数来定义每个对象,以充当默认构造函数。由于您尚未定义适当的构造函数,因此编译器无法找到初始化数组中对象的方法。指针数组没有这样的问题。

您可以通过提供默认构造函数或使用参数的默认值更改当前构造函数来修复它。