Нет соответствия для оператора [] - PullRequest
0 голосов
/ 22 февраля 2012

Поэтому я пытаюсь использовать функцию сортировки (похожую на пузырь) и передать в нее объект. Если этот объект больше (в алфавитном порядке), то переключитесь, верните истину и переключите его с предыдущим. Я продолжаю получать сообщение об ошибке внутри оператора if внутри mySort(), который говорит: «нет совпадения для operator [] в arr [j]», но, насколько я понимаю, я передаю массив объектов, верно? Почему это происходит и как я могу это решить?

Вот драйвер

#include <iostream>
#include <fstream>
#include <string>
#include "phoneEntry.h"
using namespace std;

void mySort(PhoneEntry &arr, int size)
{
    bool inOrder = false;
    string temp;
    for (int i = size - 1; i > 0 && !inOrder; i--)
    {
        inOrder = true;
        for (int j = 0; j < i; j++)
        {
            if(arr.alphaGreater(arr[j]))
            {
                inOrder = false;
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
};

int main()
{   
    const int MAXNUM = 500;
    PhoneEntry entry[MAXNUM];
    ifstream filezilla;
    filezilla.open("phone.txt");
    int count = 0;

    if(filezilla)
    {
        while(count < MAXNUM && entry[count].readEntry(filezilla))
        {
            count++;
            mySort(entry[count], count);
        }   

        for(int i = 0; i < count; i++)
        {
            entry[i].writeEntry(cout) << endl;
        }
    }
    else
    {
        cout << "404" << endl;
    }

    return 0;
}

Заголовок телефонного номера

Заголовок номера телефона

Сортировка текста (http://pastebin.com/HE8Rsmbg)

Ответы [ 5 ]

7 голосов
/ 22 февраля 2012
  1. arr должен быть массивом, а не ссылкой, как этот PhoneEntry arr[]

  2. Вы должны передать массиву весь массив, а не один элемент, например: mySort(entry, count);

Кроме этого, ваш код выглядит нормально.

Я должен добавить, что это не решение C ++: предпочтительный способ управления массивами в C ++ - использование контейнера std::vector<T> из стандартной библиотеки. Хорошая вещь о векторах заключается в том, что вам не нужно передавать их размер "сбоку".

2 голосов
/ 22 февраля 2012

Вы можете использовать
запись указателя - mySort(PhoneEntry * arr, int size)
или запись массива - mySort(PhoneEntry arr[], int size).

Если вы хотите передать весь массив при вызове функции, просто выполните mySort(entry, count).

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

из моего понимания я передаю массив объектов, верно?

Нет, вы не передаете массив объектов.Вы передаете ссылку (обозначенную & в заголовке функции) элементу PhoneEntry, который находится на count -ой позиции в массиве entry.Вы, вероятно, имели в виду PhoneEntry* arr в заголовке mySort - для этого потребуется указатель на экземпляр PhoneEntry, и поскольку имя массива можно интерпретировать как указатель на первый элемент этого массива, вы можетепросто передайте entry в качестве первого аргумента mySort.

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

arr не является массивом в вашем методе.

изменить подпись вашего метода на

void mySort(PhoneEntry *arr, int size)

и вызовите ваш метод с помощью

mySort(entry[count], count);

0 голосов
/ 22 февраля 2012

Замените это:

void mySort(PhoneEntry * arr, int size)

Вместо этого:

// Wrong
mySort(entry[count], count);

... выполните одно из следующих действий (при необходимости):

// Always passes the start of the array, "entry[0]":
 mySort(entry, count);

// Passes a pointer to a particular entry,  onwards:
 mySort(&entry[count], count);
...