【问题标题】:When trying to use a static ifstream member and accompanying function, I get a linker error尝试使用静态 ifstream 成员和随附函数时,出现链接器错误
【发布时间】:2011-12-17 20:26:54
【问题描述】:

假设如果在 .o 文件中发现错误是链接器的问题...

无论如何,我正在编写一个程序来组织我想在大学学习的课程,方法是将它们输出到格式良好的 HTML 文件中。为此,我将把我的 Course 类的一堆对象放入一个列表(我选择的数据结构,除非有人另有警告),按课程代码组织它们,然后将它们输出到上述 HTML 文件,放置每个不同的主要/次要/等之间的水平换行符。在每个断行段的顶部将是专业的名称,读起来像;

AMS(应用数学和统计)

每当用户输入课程代码(只是三个字母,而不是数字)时,我希望 class 检查代码是否在我随程序提供的 .txt 上。因为如果我最终要拥有几十个Courses,为什么还要用fstream 或每个对象的成员函数来膨胀我的代码呢?所以我想使用一些static 魔法可能是个好主意。然后我收到此错误消息,使用 g++;

(抱歉,它看起来很乱,顺便说一下,我不知道如何在这里整齐地格式化。)

在函数`std::basic_ifstream >::open(char const*, std::_Ios_Openmode)'中:

/usr/include/c++/4.5/fstream| 528 |对Course::courses' /usr/include/c++/4.5/fstream|533|undefined reference toCourse::courses' 的未定义引用 /usr/include/c++/4.5/fstream|533|未定义引用Course::courses' obj/Debug/main.o In functionstd::basic_filebuf >::is_open() const':

/usr/include/c++/4.5/fstream|223|未定义对Course::courses' obj/Debug/main.oIn functionstd::basic_ifstream >::close()'的引用: /usr/include/c++/4.5/fstream|566|未定义对Course::courses' obj/Debug/main.o:/usr/include/c++/4.5/fstream|529|more undefined references toCourse::courses'的引用

然后我被定向到 fstream 标头的这一部分;

void open(const char* __s, ios_base::openmode __mode = ios_base::in)
  {
if (!_M_filebuf.open(__s, __mode | ios_base::in))
  this->setstate(ios_base::failbit);
else
  // _GLIBCXX_RESOLVE_LIB_DEFECTS
  // 409. Closing an fstream should clear error state
  this->clear();
  }

我拥有的两个静态成员(在课程的整个收集过程的开始和结束时打开和关闭流)以及成员本身是这样声明的;

class Course
{
    public:
        Course();
        void setup();
        bool confirm();
        stringstream entry;
        static void openCodeList() { courses.open("codes"); if (!courses.is_open()) exit(1); }
        static void closeCodeList() { courses.close(); }
    private:
        //Irrelevant strings and bits, etc, etc.
        static ifstream courses;
}

我确实有其他 .cpp 和 .h 文件涉及(即一个 File 类来处理最终实际输出的所有内容),但我什至没有在其中提到这些 fstream 相关成员,但显然是我的 WIP main。 cpp;

int main()
{
    cout << "Welcome to the Stony Brook Course Organizer!  This program will help you\n"
            "organize the courses that you wish to take at Stony Brook University.\n\n";
    Course thefirst;
    Course::openCodeList();
    thefirst.setup();
    thefirst.confirm();
    Course::closeCodeList();
}

在处理我的static 问题和对未来的建议(即使与此没有直接关系)方面的任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 您在任何地方都有Course::courses 的定义吗? (类主体中的static ifstream courses; 只是一个声明,您需要在类主体之外的某个地方进行定义,例如(std::ifstream Course::courses;
  • courses 是读取 Stony Brook 专业列表的 ifstream 的名称,所以是的。我可能应该(并且会)更好地命名它。
  • 我不明白你在这种情况下定义它的意思。你介意解释一下吗? (该死,忘记了编辑按钮。)
  • 我并没有以任何方式反对会员的名字。
  • 不,但我现在认为这可能会引起混淆。我只是想确保每个人都在同一页面上。哦,我定义的这两个函数是内联的,所以我不需要在主 .cpp 文件中定义它们。

标签: c++ class static fstream


【解决方案1】:

您需要在程序的源文件中,在类定义之外定义静态成员。

例如在 .cpp 中:

std::ifstream Course::courses;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-11
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    相关资源
    最近更新 更多