Предоставление struct в качестве параметра функции не работает

#c #struct #doubly-linked-list

#c #struct #двусвязный список

Вопрос:

Я создал структуру списка с двойной связью, и я хочу использовать функцию duplaLista для соединения узлов и вставки значений.На самом деле я нашел в чужом вопросе, как указать struct в качестве параметра при вызове функции. Но у меня это не сработает (неполный тип не допускается). Я также прочитал ответы по этому вопросу, но я не могу понять, что я делаю не так, потому что я только что увидел, что это должно быть сделано таким образом, не то чтобы я это полностью понял? Может кто-нибудь сказать мне, что не так, и объяснить мне, почему?

 #include "DoubleList.h"
#include<iostream>
#include<stdio.h>
#include"string"
using namespace std;

struct Cvor
{
    Cvor *head;
    Cvor *tail;
    char vred;

    Cvor(const char amp;value, Cvor *prev = NULL, Cvor *next = NULL) : vred(value),
                                                                    head(next), tail(prev)
    {}

};

void duplaLista(Cvor *cvor)
{

}


int main(int argc, char *argv[])
{   
    Cvor cvor;

    duplaLista(cvor);

    return 0;
}
  

Комментарии:

1. duplaLista(cvor); -> duplaLista(amp;cvor);

2. у меня по-прежнему не работает (я читал, что в c можно написать cvor без amp;, это все равно должно работать). В любом случае, спасибо, не могли бы вы подробнее объяснить мне эту структуру, заданную в качестве параметра?

3. ! Я читал, что в c можно писать cvor без amp;» , только если вы объявляете ссылочный параметр.

4.Просто в качестве комментария, ваша проблема не связана с использованием struct вместо класса. в c структуры и классы — это (почти) одно и то же. Единственное различие, которое я знаю, заключается в том, что по умолчанию члены структуры являются общедоступными, а члены класса — частными. Но в обоих случаях вы можете использовать модификаторы public: protected: и private: для изменения этих значений по умолчанию.

Ответ №1:

 void duplaLista(Cvor *cvor)
  

Компилятор считывает программу для компиляции от начала до конца. На данный момент Cvor не определено. Ваше определение этого класса появится позже.

В C классы, шаблоны, функции и все остальное должны быть определены до их использования.

Вам нужно переместить определение класса из main() функции в глобальную область видимости, прежде чем оно будет использовано здесь.

Комментарии:

1. Я понял, спасибо!!! Теперь это работает, за исключением Cvor cvor; который находится в main(). Мне не хватает конструктора по умолчанию, поскольку я переместил конструктор за пределы main .. как я могу это решить?

2. Если вам не хватает конструктора по умолчанию, просто объявите и определите конструктор по умолчанию.

Ответ №2:

Здесь у вас две ошибки. Во-первых, поскольку вы не определили конструктор по умолчанию для Cvor, если вы не предоставите минимально необходимые параметры для построения Cvor, объявление в main (т. е. Cvor cvor) завершится ошибкой. Вам нужно предоставить ему некоторый образец const char amp;, чтобы иметь возможность его сконструировать. Когда это будет сделано, вам нужно исправить неправильный тип параметра, который вы предоставляете duplaLista. После исправления ваша основная функция должна выглядеть следующим образом. Параметр ‘A’, который я привел ниже, является всего лишь примером начального значения. Замените его тем, что вы считаете полезным.

 int main(int argc, char *argv[])
{   
    Cvor cvor('A');
    duplaLista(amp;cvor);
    return 0;
}
  

Комментарии:

1. Спасибо за ваш ответ, я думал, что никто не видел мою правку, поэтому мне пришлось задать другой вопрос. Насколько я понимаю, cvor должен быть экземпляром struct Cvor, и он должен содержать два указателя и символ в качестве значения. Каким должно быть начальное значение внутри скобок (на самом деле я этого не понимаю). второй: должен ли я использовать amp;cvor, если у меня есть duplaLista (Cvor cvor){}, и функция вызывает duplaLista (cvor). В чем было бы отличие от (Cvor * cvor) и duplaLista (amp; cvor)? Надеюсь, вы понимаете мои вопросы! Спасибо