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:“填充”:无法将参数 1 从“城市 *”转换为“int []”

不知何故,我看到了,它说 Class 'City *" 和 int[] 数组有问题,但无法弄清楚。我用 double 但相同的概率更改了 'int'。这是问题,否则看起来很简单文件中的数组填充函数。知道它有什么问题吗?

那么,怎么会

void fill(City& arr, int size) 的身体想要什么?

4

3 回答 3

2

void fill(int arr[], int size)意味着您需要传递 to 的int数组fill。但是,您正在向它传递一个 的实例City,特别hm是在您的 main.xml 中。

我假设您正在尝试从中读取City描述列表cities.txt(因此具有适当的流提取/插入运算符)。更改签名fill以接受指向City对象的指针,以便您可以填写对象数组City而不是ints。

void fill(City *arr, int size); 

确保您fill在 main 中传递的参数是正确分配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
于 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::vectororstd::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 回答