【发布时间】: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 文件中定义它们。