繁体   English   中英

在C ++中创建公共类

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM