2012-06-15 6 views
1

Ну, Вот код C++ У меня есть здесь и не могу скомпилироватьНевозможно преобразовать параметр 1 из «класса *» до «двойной []»

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

const int n = 900; 
class City{ 
string name; 
double area; 
int count, roads; 


public: 
City() {} 
City(string a, double b, int c, int d) { a=name; b=area; c=count; d=roads;} 
string getname() {return name;} 
double getarea() {return area;} 
int getcount() {return count;} 
int getroads() {return roads;} 
friend ostream& operator << (ostream& , City&); 
friend istream& operator >> (istream& , City&); 

}; 

ostream& operator << (ostream& out, City& a) { 
out<<"name "<<a.name<<", area "<<a.area<<", count "<<a.count<< ", roads "<<a.roads<<endl; 
return out; 
} 
istream& operator >> (istream& in, City& a) { 
in>>a.name>>a.area>>a.count>>a.roads; 
return in; 
    } 
void fill(int arr[], int size){ 
ifstream ifs("cities.txt."); 
for (int i=0;i<size;i++) 
    ifs>>arr[i]; 
    } 


void func(City* arr){ 
ofstream ofs("density.out"); 
for(int i=0;i<n;i++){ 
    if(arr[i].getcount()/arr[i].getarea()>1000) 
     ofs<<arr[i]; 
} 
    } 

    int main(){ 
City* hm; 
hm = new City[n]; 
fill(hm, n); 
func(hm); 
system ("pause"); 
return 0; 
} 

Здесь ошибка я получаю во время компиляции:

ошибка C2664: «заполнить»: не удается преобразовать параметр 1 из «Город *» до 'Int []

как-то я вижу, что он говорит что-то не так с класса «Город * " И в t [], но не может понять. Я меняю 'int' на двойную, но ту же самую проблему. Это проблема, в противном случае это просто простая функция заполнения массива из файла. любая идея, что в этом плохого?

Итак, как бы

пустота заполнения (Город & обр, внутр размер) «s тело хотели бы?

+0

Я думаю, что фраза 'void fill (City ...) 's body хотела бы?' Немного запутанна, нет? –

ответ

2

void fill(int arr[], int size) означает, что вам нужно передать массив int в fill. Тем не менее, вы передаете ему экземпляр City, в частности hm в вашем главном.

Я предполагаю, что вы пытаетесь прочитать в списке City описания из cities.txt (и, следовательно, иметь соответствующие операторы извлечения/вставки потока). Измените подпись fill, чтобы принять указатель на City объектов, чтобы вы могли заполнить массив из City объектов, а не int s.

void fill(City *arr, int size); 

Убедитесь, что аргумент вы передаете fill в основном является правильно выделяются массивом City объектов размера по крайней мере sz где sz является то, что вы передаете в качестве второго параметра. Имейте в виду позвонить delete [], чтобы освободить этот массив, который вы создаете.

Более идиоматический подход заключается в использовании vector<City>, так что вам не придется беспокоиться о проблемах управления памятью. Измененная fill подпись затем будет:

void fill(std::vector<City>& c); // note we no longer need the second argument 

Вы должны #include <vector> для того, чтобы иметь возможность использовать vector<City> хотя.

Наконец, чтобы воспользоваться преимуществами RVO, просто возвращайте значение vector<City> по значению вместо того, чтобы передавать его в качестве параметра. Таким образом, вы могли бы сделать что-то вроде:

std::vector<City> fill(); // cleaner, faster 
0

void fill(int arr[], int size) ожидает int массива. Вы пытаетесь передать ему массив City.

Вы можете написать новую функцию, void fill(City& arr, int size) или можете рассмотреть возможность написания шаблонной функции, template<class T> void fill(T* arr, size) и т. Д.

Также рассмотрите использование std::vector или std::array вместо обнаженных массивов. Проверка границ и управление памятью будет намного проще.

Вот несколько примеров fill:

// keep reading til we run out of cities in the file 
void fill_vector(vector<City>& cities) 
{ 
    ifstream ifs("cities.txt."); 
    City city; 

    while (!ifs.fail() && !ifs.bad()) 
    { 
     ifs >> city; 
     cities.push_back(city); 
    } 
} 

// only read 'n' cities 
void fill_array(array<City, 5>& cities, size_t count) 
{ 
    ifstream ifs("cities.txt."); 
    for (size_t i = 0; i < count; i++) 
     ifs >> cities[i]; 
} 
+0

Я ничего не знаю о std :: vector и std :: ... еще. Как приближается Эта функция: пустое заполнение (City & arr, int size) будет выглядеть как соответствующая моей программе? –

+0

Пара функций, добавленных в мой ответ. Я сам их не тестировал. Проверка на 'fail()' и 'bad()' может быть избыточной, но вы можете проверить это самостоятельно ;-) – Rook

0

Вы используете неправильный fill. Функция, которую вы хотите, - это шаблонная версия в <algorithm>: void fill (ForwardIterator first, ForwardIterator last, const T& value); (см. here).

Так что для того, чтобы инициализировать каждый элемент с объектом по умолчанию City, ваш звонок стал бы:

std::fill(hm, &(hm[n]), City()); 

или (более читаемым и показывает намерение):

std::fill(&(hm[0]), &(hm[n]), City()); 

Edit: I см. теперь, когда я неправильно понял ваш вопрос и что вы хотите заполнить свой массив hm хранимыми объектами.

Как было предложено в других ответах, изменение подписи вашей функции fill на fill (City * const arr, size_t const n) должно исправить это.

Смежные вопросы