在C++中创建公共类

Creating a public class in C++

本文关键字:创建 C++      更新时间:2023-10-16

如果你介意帮忙,我有一个小问题。

我正在盯着学习如何使用类,但是当我尝试将程序的某个部分(要求用户打开文件名)变成函数并将其公开时,我遇到了问题。

在我的原始主.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++的基本知识