在函数中使用Ifstream(无法访问类中声明的私有成员)

时间:2014-02-20 23:53:38

标签: c++ arguments private member ifstream

我在学习C ++时将ifstream参数传递给函数时遇到了问题。 不幸的是,仍然在学习基础知识,所以我没有任何运气,无论是在线找到解决方案,还是自己解决。

守则:

#include <iostream>
#include <string>
#include  <fstream>
using namespace std;

int TakefromFile(ifstream gradesinput);
void OutputtoFile();
char GradetoLetter();

void main()
{

    int Studentcount = 0; // Variable that keeps track of the number of students calculated

    ifstream gradesinput; 
    gradesinput.open("grades.txt");

    ofstream gradesoutput; 
    gradesoutput.open("sorted_grades.txt");

    while (gradesinput) // While the file has content to be read
    {
        TakefromFile(gradesinput); //Take data from the line
        OutputtoFile(); //Add it to the output

        Studentcount ++; //Increase studentcount by 1
    }

    gradesinput.close(); //Close both reading and writing files
    gradesoutput.close();
}

int TakefromFile(ifstream gradesinput)
{
    char firstname[20];
    firstname[0] = gradesinput.get();
cout << firstname;
    return 0;
}

void OutputtoFile()
{
}

char GradetoLetter()
{
}

错误在主函数“While循环”中,特别是“TakefromFile”函数 因为“gradeinput”而打电话。调试时,错误显示为:

'std::basic_ifstream<_Elem,_Traits>::basic_ifstream' : cannot access private member                                           declared in class 'std::basic_ifstream<_Elem,_Traits>'  
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          c:\program files (x86)\microsoft visual studio 11.0\vc\include\fstream(827) : see declaration of 'std::basic_ifstream<_Elem,_Traits>::basic_ifstream'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]

感谢任何帮助。如果这是我应该看到的容易的事情,我会道歉。 谢谢!

2 个答案:

答案 0 :(得分:0)

在你的函数中,不要按值传递ifstream:

int TakefromFile(ifstream gradesinput)

但请参考

int TakefromFile(ifstream& gradesinput)

答案 1 :(得分:0)

当您将某些内容传递给函数时,实际上会创建一个在括号之间写入的内容的副本,然后由函数使用。大多数对象都不允许您创建自己的副本,因为它根本没有效率,通常不是您想要做的。

&amp; symbol用于获取对象的地址,或者换句话说, reference 到达其在内存中的位置。您可以创建实际需要这样的引用的函数:

void foo(int& number);

void bar(int &number);

&amp;的位置标志没关系。它实际上告诉函数使用“存在于内存中”的变量,而不是复制变量。这允许您创建修改发送给它们的内容的功能。当你从它们读取时修改了ifstream--它们的内部光标会移动。所以你想通过引用传递它们。

如果您想通过引用传递某些内容以避免复制大对象但您不希望用户能够修改它,则可以进行const引用。你会在学习中看到这么多:     void something(const object&amp; obj);