Вызов функции-члена внутри функции-члена

#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. Когда вы определяете оболочку как класс, тогда да, это не оболочка. Но для удобства понимания вы можете сказать, что. Но, конечно, вы правы.