#c #c 11
#c #c 11
Вопрос:
Я пытаюсь создать функцию-член, которая принимает четыре входных данных, основной список, ключ и два дополнительных списка. Затем он делит основной список на два дополнительных списка на основе ключа.
Это из книги по программированию, поэтому там требуется, чтобы это была функция-член.
Я получаю эту ошибку: «базовый операнд «->» имеет тип без указателя ‘UnsortedType’.
Это целая функция, которая вызывает проблему.
void UnsortedType::SplitLists(UnsortedType list,
ItemType item,
UnsortedTypeamp; list1,
UnsortedTypeamp; list2){
ItemType whichItem;
int numItems = list.GetLength();
//Loop through all items in the list
for(int i = 0; i < numItems; i ){
whichItem = list.GetNextItem();
try{
switch(whichItem.ComparedTo(item)){
case LESS:
case EQUAL:
if(list1->isFull()){//Error thrown on this line
throw std::string("List1 is full.");
return;
}
//add item to list1
list1->PutItem(whichItem);//Error thrown on this line
break;
case GREATER:
if(list2->isFull()){//Error thrown on this line
throw std::string("List2 is full.");
return;
}
//add item to list2
list2->PutItem(whichItem);//Error thrown on this line
break;
}
}
catch(std::string e){
std::cout << e << std::endl;
}
}
};
Обратите внимание, что «list1» и «list2» являются несортированными типами, передаваемыми по ссылке, и я думаю, что это часть проблемы.
Что я делаю не так?
Спасибо за ваше время.
Комментарии:
1. Что бы это была за книга по программированию?
2. «C плюс структуры данных» Дейла, Уимса и Ричарда.
3. Класс колледжа…
Ответ №1:
Ссылки могут использоваться так, как если бы вы просто использовали исходный объект. Если вы передаете что-то по ссылке, то вы можете просто использовать .
вместо ->
void UnsortedType::SplitLists(UnsortedType list,
ItemType item,
UnsortedTypeamp; list1,
UnsortedTypeamp; list2){
ItemType whichItem;
int numItems = list.GetLength();
//Loop through all items in the list
for(int i = 0; i < numItems; i ){
whichItem = list.GetNextItem();
try{
switch(whichItem.ComparedTo(item)){
case LESS:
case EQUAL:
if(list1.isFull()){//Error thrown on this line
throw std::string("List1 is full.");
return;
}
//add item to list1
list1.PutItem(whichItem);//Error thrown on this line
break;
case GREATER:
if(list2.isFull()){//Error thrown on this line
throw std::string("List2 is full.");
return;
}
//add item to list2
list2.PutItem(whichItem);//Error thrown on this line
break;
}
}
catch(std::string e){
std::cout << e << std::endl;
}
}
};
Ответ №2:
Вы передаете ссылку, а не указатель.
Тип и тип // Ссылка используется как type.do_smth()
Type* type // Указатель используется как type-> do_smth() // потому что сначала вам нужно «разыменовать» его.
В общем случае указатель представляет собой оболочку вокруг ссылки. Указатель СОДЕРЖИТ ссылку на что-либо.
Комментарии:
1. «в общем случае указатель представляет собой оболочку вокруг ссылки». — этого никогда не бывает, указатель — это базовый тип языка.
2. Когда вы определяете оболочку как класс, тогда да, это не оболочка. Но для удобства понимания вы можете сказать, что. Но, конечно, вы правы.