[英]Creating a public class in C++
如果您愿意帮助我,我有一个小问题。
我正盯着学习如何使用类,但是当我尝试将程序的某个部分(向用户询问要打开的文件名)变成一个函数并将其公开时,我遇到了一个问题。
在我原来的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;
在我拥有所有功能的另一个.cpp lib.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函数也是如此吗? 他们是固定的替代品吗? 这些只是我的代码的作用。 这还不是全部,但是我认为这是与此问题相关的唯一代码。 欢迎任何建议/帮助/建议。 谢谢您的支持!
在新的main.cpp中,infile超出范围。 它仅存在于GetFileByName()
的实现中。 此外,执行后:
Image bo; //create object
bo.GetFileName();
您已经创建了一个对象,并使用bo.GetFileName();
打开了一个ifstream bo.GetFileName();
,但您无需关闭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()
关闭!
编译器正确,未声明infile
。 可以说,在调用函数时,发生在函数内部的所有东西都留在函数内部。 这称为本地范围。 返回值是您“退出”的唯一内容,在您的情况下为空。
因此,最好的方法是将函数的返回类型更改为“ std :: ifstream”,并在函数末尾添加return infile
。 然后,您可以在调用函数时执行此操作:
Image bo; //create object
ifstream infile = bo.GetFileName();
int w, h;
string s;
infile >> s;
另一种可能更通用的方法是使函数返回字符串,但是我猜您在使用流有某些原因。
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 ++的一些基本知识
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.