【问题标题】:C++ Linked list creation - passing in an arrayC++ 链表创建 - 传入数组
【发布时间】:2012-02-28 13:31:00
【问题描述】:

我正在用 C++ 创建一个链表,但我不知道如何在构造函数中将数组作为参数传递,或者这是否是合法的语法。

这是我得到的错误:

CheckTextFile.cpp: In constructor ‘Node::Node(char*, int)’:
CheckTextFile.cpp:19: error: incompatible types in assignment of ‘char*’ to ‘char [0u]’
CheckTextFile.cpp: In constructor ‘Node::Node(char*, int, Node*)’:
CheckTextFile.cpp:24: error: incompatible types in assignment of ‘char*’ to ‘char [0u]’

这是我的代码:

class Node{
public:
    int length;
    char data[];
    Node * next;
    Node(char x[], int y){
        data = x;
        length = y;
        next = NULL;
    }
    Node(char x[], int y, Node * z){
        data = x;
        length = y;
        next = z;
    }

};

【问题讨论】:

  • “我正在用 C++ 创建一个链表”,纯粹是一种学术练习,希望如此。世界不需要另一个 C++ 列表类!

标签: c++ arrays list linked-list


【解决方案1】:
class Node{
public:
    int length;
    char *ptr_data;  //pointer 
    Node * next;
    Node(char *x, int y){
        ptr_data = x;  //pointer assignment
        length = y;
        next = NULL;
    }
    Node(char *x, int y, Node * z){
        ptr_data = x;    //pointer assignment
        length = y;
        next = z;
    }
};

【讨论】:

  • 这会更有效,因为它避免了不必要的复制。如果 char *x 超出范围,只会出现问题。如果存在这种情况,那么您应该使用副本。这就是 char 数组 strcpy(dest,source) 就可以了。
【解决方案2】:

您正在传递一个指向数组第一个元素的指针,实际上这是正确的。

编译器抱怨构造函数内部的赋值:

data = x;

您不能像这样分配数组,而不是像对象一样,您必须将每个元素从源数组复制到目标数组。
使用循环构造或使用std::copy

这样做的一种简单方法(有效的是使用std::copy):

Node(char x[], int y)
{
     for(int i = 0;i<y; ++i)
     { 
         data[i] = x[i];
     }
     length = y;
     next = 0;
}

或者简单

std::copy(x,x+y,data);

它会compile cleanly

附带说明,使用 std::string 比使用 char 数组要好得多。

【讨论】:

  • memcpy 可能是最“C-like”的方式。
【解决方案3】:

首先,在 C++ 中,不能有未指定大小的数组。此外,您可以使用指针代替数组或std:string

【讨论】:

    【解决方案4】:

    您的参数传递很好。但是,您的:

    char data[];
    

    声明一个没有大小的数组,所以编译器拒绝生成代码来放任何东西也就不足为奇了。也许试试:

    std::string data;
    

    这是假设您的 x[] 代表一个以 NUL 结尾的 C 字符串。

    完成之后,了解构造函数的成员初始化语法

    【讨论】:

    • 这不是编译器令人窒息的东西(我相当确定零大小数组是 gcc 扩展)。编译器在分配数组时失败(你不能像在 C++ 中那样复制数组)。
    • 这个错误是关于构造函数内部的赋值,而不是由于传递了指向数组的指针。
    • 谢谢。我会调查的。
    猜你喜欢
    • 2021-07-30
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多