在C++中创建公共类
Creating a public class in C++
如果你介意帮忙,我有一个小问题。
我正在盯着学习如何使用类,但是当我尝试将程序的某个部分(要求用户打开文件名)变成函数并将其公开时,我遇到了问题。
在我的原始主.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();
};
创建类后,我的新主.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。更早地获取文件名?他们是修复的替代品吗?这些只是我的代码的发挥。这不是全部,但我觉得这是与此问题相关的唯一代码。欢迎任何意见/协助/建议。感谢您的支持!
在新的 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()
!
编译器是正确的,infile
没有声明。可以这么说,调用函数时,其中发生的一切都会保留在其中。这称为局部范围。你唯一"得到"的是返回值,在你的例子中是无效的。
因此,最好的方法是将函数的返回类型更改为"std::ifstream",并在函数末尾添加一个return infile
。然后,您将在调用函数时执行此操作:
Image bo; //create object
ifstream infile = bo.GetFileName();
int w, h;
string s;
infile >> s;
另一种也许更通用的方法是使函数返回字符串,但我猜您使用流是有原因的。
infile 超出范围。有一个解决方案
更改函数 lib 中 GetFileName 返回的值.cpp
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++的基本知识
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++类内存结构中创建"spacer"?
- 终端不会为C++文件创建.exe文件吗
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息