C ++ Создание связанного списка - передача в массив - PullRequest
1 голос
/ 07 февраля 2012

Я работаю над созданием связанного списка в 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;
    }

};

Ответы [ 4 ]

3 голосов
/ 07 февраля 2012

Ваш аргумент в порядке.Однако ваш:

char data[];

объявляет массив без размера, поэтому неудивительно, что компилятор отказывается генерировать код для размещения чего-либо там.Возможно, попробуйте:

std::string data;

Предполагается, что ваш x[] представляет строку C, оканчивающуюся NUL.

После этого вы узнаете о синтаксисе инициализации члена для конструкторов.

1 голос
/ 07 февраля 2012

Вы передаете указатель на первый элемент массива, и на самом деле это правильно.

Компилятор жалуется на присваивание внутри конструктора:

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);

И он будет скомпилирован чисто .

Кстати, вам гораздо лучше использовать std::string вместо использования массивов символов.

0 голосов
/ 07 февраля 2012
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;
    }
};
0 голосов
/ 07 февраля 2012

Прежде всего, в C ++ вы не можете иметь массив неопределенного размера.Также вы можете использовать указатель вместо массива или std:string.

...