用C ++创建公共类

时间:2015-03-14 06:41:30

标签: 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;

在我的另一个名为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?他们是修理的替代方案吗?这些只是我的代码的一部分。这不是全部,但我觉得这是与此问题相关的唯一代码。欢迎任何建议/协助/建议。感谢您的支持!

3 个答案:

答案 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 ++的基本知识