嗯,这是我在这里得到的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 []'
不知怎的,我看到了,它说Class'City *“和int []数组有问题,但是无法搞清楚。我用'double'改变'int'但是同样的概率。 这是问题,否则它似乎是一个简单的数组填充函数从文件。 知道它有什么问题吗?
那么,怎么会
void fill(City&amp; arr,int size) 的身体想要?
答案 0 :(得分:2)
void fill(int arr[], int size)
表示您需要将int
的数组传递给fill
。但是,您在主要文件中传递了City
的实例,特别是hm
。
我假设您正在尝试从City
读取cities.txt
描述列表(因此具有适当的流提取/插入运算符)。更改fill
的签名以接受指向City
个对象的指针,以便您可以填写City
个对象而不是int
个数组。
void fill(City *arr, int size);
确保传递给main中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
答案 1 :(得分: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];
}
答案 2 :(得分: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());
编辑:我现在看到我误解了您的问题,并希望用存储的对象填充hm
数组。
正如其他答案中所建议的那样,将fill
功能的签名更改为fill (City * const arr, size_t const n)
应该可以解决此问题。