如果你介意帮忙,我有一个小问题。
我正在学习如何使用类,但是当我尝试将某个程序的某个部分(要求用户打开文件名)打成一个函数并将其公开时,我遇到了一个问题。
在我原来的main.cpp文件中,我有这个代码,我试图向用户询问他或她想要打开的文件名:
char in_filename[50];
ifstream infile;
cin.getline(in_filename, 50);
infile.open(in_filename);
if(!infile.is_open())
{
cout << "File cannot load."<< endl;
exit(EXIT_FAILURE);
}
int w, h;
string s;
infile >> s;
outfile <<s<<endl;
infile >> w;
outfile << w<<" ";
infile >> h;
outfile <<h<<endl;
infile >> s;
outfile <<s<<endl;
在我的另一个名为lib.cpp文件的.cpp中,我有我的所有功能,我尝试将代码转换为:
void PPMImage::GetFileName()
{
char in_filename[50];
ifstream infile;
cin.getline(in_filename, 50);
infile.open(in_filename);
if(!infile.is_open())
{
cout << "File cannot load."<< endl;
exit(EXIT_FAILURE);
}
}
在我的标题文件中,我有:
class Image
{
public:
void GetFileName();
};
创建类之后,我的新main.cpp是:
Image bo; //create object
bo.GetFileName();
int w, h;
string s;
infile >> s;
outfile <<s<<endl;
infile >> w;
outfile << w<<" ";
infile >> h;
outfile <<h<<endl;
infile >> s;
outfile <<s<<endl;
然而,在我运行代码之后,我收到一条错误消息,指出'infile'未定义。这是因为infile是在lib.cpp中定义的,并且main.cpp中的变量'infile'没有提取它,即使我之前调用函数bo.GetFileName?他们是修理的替代方案吗?这些只是我的代码的一部分。这不是全部,但我觉得这是与此问题相关的唯一代码。欢迎任何建议/协助/建议。感谢您的支持!
答案 0 :(得分:1)
在新的main.cpp中,infile超出了范围。它仅存在于GetFileByName()
的实现中。此外,执行后:
Image bo; //create object
bo.GetFileName();
您已经创建了一个对象,并使用bo.GetFileName();
打开了一个ifstream,但是您打开了ifstream而没有关闭它。你应该做的是
(1)让GetFileName()
返回ifstream infile
,以便您可以在main.ccp中访问它(并使用它执行输入操作)。这看起来像这样:
Image bo; //create object
ifstream infile = bo.GetFileName();
或
(2)(在我看来是首选选项)将ifstream infile
声明为Image
类的私有成员,以便您可以实现允许来自ifstream
的输入的函数。
class Image {
public:
void GetFileName();
//methods to allow input operations from infile
private:
ifstream infile;
};
无论哪种方式,您都需要确保ifstream
保留在范围内,并在程序终止前使用.close()
关闭!
答案 1 :(得分:0)
编译器正确,未声明infile
。当调用一个函数时,它内部发生的一切都会留在它里面,可以这么说。这称为局部范围。只有你&#34;走出去#34;是返回值,在您的情况下为空。
所以,最好的方法是将你的函数的返回类型改为&#34; std :: ifstream&#34;并在函数末尾添加return infile
。然后在调用函数时执行此操作:
Image bo; //create object
ifstream infile = bo.GetFileName();
int w, h;
string s;
infile >> s;
一种替代的,也许更普遍的方法是让函数返回一个字符串,但我猜测你为什么要使用流。
答案 2 :(得分:0)
infile超出范围。有一个解决方案
更改lib.cpp中函数GetFileName返回的值
ifstream PPMImage::GetFileName()
{
char in_filename[50];
ifstream infile;
cin.getline(in_filename,50);
infile.open(in_filename);
if(!infile.is_open())
{
cout<<"File cannot load"<<endl;
exit(EXIT_FAILURE);
}
return infile;
}
此外,您应该在头文件
中更改GetFileName()的值类型然后像这样修复main.cpp
Image bo;
ifstream infile=bo.GetFileName();
int w,h;
...
我的英语不好,希望这可以帮到你。
ps:你真的要学习一些c / c ++的基本知识