Так из-за круговую зависимость между моими классами моего узел выглядит какполучает значение данных от узла, указатель путаница
struct Node{
Word * data;
Node * next;
};
Так, при создании нового узла я делаю (ш быть типом Word, newptr быть данными член класса)
newptr = new Node;
newptr-> data = &w;
newptr-> next = NULL;
Если я хочу, чтобы получить доступ к данным в первом узле связанного списка, я думаю, что правильный метод
Word retVal;
Node *temp;
temp = head->next;
retVal = temp->data;
return retVal;
Однако данные являются указателями на тип Word, это не сам тип Word. Но я хочу вернуть Word, а не указатель Word. Так я бы сделал, могу ли я добавить Word * word;
, затем word = temp->data;
и retVal = *word;
? Моя тестовая программа говорит мне, что то, что я делал по пути, неверно, потому что я получаю ошибку сегментации, когда я добираюсь до функции. Я пытаюсь это
Word retVal;
Word * word;
Node *temp;
temp = head->next;
word = temp->data;
retVal = *word;
return retVal;
И используя COUT линии в разных местах, я знаю, что моя вина происходит в word = temp->data
линии
Моих членов класса слов по запросу:
class Word{
public:
char * charArray;
char * sendBack; //ignore
char * rest; //ignore
bool isPigLatin;
bool firstIsVowel;
Word();
Word(const Word& w);
Word(char array[], int size);
~Word();
void show(); //ignore
//ignore everything below
friend ostream& operator<< (ostream& out, const Word& w);
Sentence operator+ (Sentence s);
Sentence operator+ (Word w);
void operator+ (int i);
Word& operator++(int);
Word& operator++();
Word& operator--(int);
Word& operator--();
};
много эти вещи не имеют отношения к самому связанному списку, но я включил все на всякий случай
Копировальный конструктор для Word, по запросу:
Word::Word(const Word& w){
cout << "Copy constructor for Word" << endl;
int size = 0;
while(w.charArray[size]){
size++;
}
charArray = new char[size + 1]; //+1 for \0 at end
int i = 0;
while(w.charArray[i]){
charArray[i] = w.charArray[i];
i++;
}
if(!w.isPigLatin){
isPigLatin = false;
}
else{
isPigLatin = true;
}
}
firstIsVowel, sendBack, а остальные не объявлены, пока они не должны быть использованы в ++ и - перегруженные, поскольку они предназначены для создания слова на латынь Свиньи и обратно на английский
мой конструктор :
Word::Word(char array[], int size){
//In my test code I am hard coding a char array and its size, for the actual program I read in the char array from a file, then go thru the char array to get the size before calling Word(char c[], int s)
cout << "Character Array Word constructor" << endl;
int i = 0;
charArray = new char[size];
while(array[i]){
charArray[i] = array[i];
i++;
}
isPigLatin = false;
//this is needed for my Pig Latin function. All words will be read in as English, thus Piglatin = false. If the function to change PigLatin into English is called, nothing will happen since this is false. It gets set to true in the function that changes English to Pig Latin
}
и конструктор по умолчанию
Word::Word(){
cout << "Default constructor for Word" << endl;
charArray = new char[1];
sentBack = new char[1];
rest = new char[1];
}
Почему вы назначаете новый Узел, когда мгновенно отправляете точку «temp» в голову? – Creris
Это хороший момент. Нет причин для этого. Я пытался сделать шаг за шагом, нет причин для этого, если я просто установлю его на 'head'. Это не устраняет мою ошибку сегментации, но –
@TommyK - 'Если я хочу получить доступ к данным в первом узле связанного списка,' доступ к данным не должен включать никакого динамического распределения вообще. Просто дойдите до нужного узла и верните данные. – PaulMcKenzie