1

さて、これが私がここに持っているC++コードであり、コンパイルできません

#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: 'fill': パラメーター 1 を 'City *' から 'int []' に変換できません

どういうわけか、クラス 'City *" と int[] 配列に何か問題があると表示されていますが、わかりません。「int」を double で変更しますが、同じ確率で変更します。それが問題です。それ以外の場合は単純なようですファイルからの配列充填関数.何が問題なのですか?

では、どのように

void fill(City& arr, int size) のボディはいかがですか?

4

3 に答える 3

2

void fill(int arr[], int size)inttoの配列を渡す必要があることを意味しますfillCityただし、具体的にはメインで のインスタンスを渡していますhm

Cityからの説明のリストを読み込もうとしているcities.txt(したがって、適切なストリーム抽出/挿入演算子がある)と想定しています。の署名をオブジェクトfillへのポインターを受け入れるように変更して、sではなくオブジェクトCityの配列を入力できるようにします。Cityint

void fill(City *arr, int size); 

main で渡す引数が、少なくとも2 番目のパラメーターとして渡すサイズfillのオブジェクトの適切に割り当てられた配列であることを確認してください。を呼び出して、作成したこの配列を解放することに注意してください。Cityszszdelete []

より慣用的なアプローチは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
于 2012-06-15T11:09:10.553 に答える
0

void fill(int arr[], int size)配列がint必要です。City配列を渡そうとしています。

新しい関数を作成するかvoid fill(City& arr, int size)、テンプレート化された関数template<class T> void fill(T* arr, size)などを作成することを検討できます。

また、ネイキッド配列の代わりにstd::vectororを使用することも検討してください。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];
}
于 2012-06-15T11:09:24.560 に答える
0

あなたは間違ったを使用していfillます。必要な関数は、次のテンプレート化されたバージョンです<algorithm>: void fill (ForwardIterator first, ForwardIterator last, const T& value);(こちらを参照)。

したがって、すべての要素をデフォルトCityオブジェクトで初期化するには、呼び出しは次のようになります。

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

または(より読みやすく、意図を示します):

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

編集:あなたの質問を誤解していて、hm配列に格納されたオブジェクトを入力したいことがわかりました。

他の回答で示唆されているように、fill関数の署名を変更してfill (City * const arr, size_t const n)修正する必要があります。

于 2012-06-15T11:13:08.430 に答える