在 Bruce Eckel 的“Thinking in C++”的帮助下学习 C++,卡在练习 32,第 10 章。问题是如何更改链接顺序,Mirror::test() 调用对象 m5 返回 false。这是我的代码。
镜像.h:
#ifndef MIRROR_H_
#define MIRROR_H_
class Mirror {
public:
Mirror() {logic_ = true; self_ = 0;};
Mirror(Mirror *ptr) {self_ = ptr; logic_ = false;};
bool test() {
if (self_ != 0) {
return self_->test();
} else {
return logic_;
}
};
private:
bool logic_;
Mirror *self_;
};
#endif // MIRROR_H_
任务
一.cpp
#include "mirror.h"
Mirror m1;
二.cpp
#include "mirror.h"
extern Mirror m1;
Mirror m2 (&m1);
三.cpp
#include "mirror.h"
extern Mirror m2;
Mirror m3 (&m2);
等等。最后,
五.cpp
#include "mirror.h"
#include <iostream>
extern Mirror m4;
Mirror m5 (&m4);
int main(int argc, char* argv[]) {
std::cout << m5.test() << std::endl;
}
m5.test() 返回真。任务说,我应该更改链接顺序,m5.test() 返回 false。我曾尝试使用:
init_priority(优先级)
在标准 C++ 中,保证在命名空间范围内定义的对象按照严格按照它们在给定翻译单元中定义的顺序进行初始化。不保证跨翻译单元的初始化。但是,GNU C++ 允许用户通过指定相对优先级来控制在命名空间范围内定义的对象的初始化顺序 init_priority 属性,这是一个当前介于 101 和 65535 之间的常量整数表达式。较低的数字表示较高的优先级。
但没有运气。
完整的练习文本:
在头文件中,创建一个包含两个数据成员的 Mirror 类:一个指向 Mirror 对象的指针和一个 bool。给它两个构造函数:默认构造函数将 bool 初始化为 true,将 Mirror 指针初始化为零。第二个构造函数将指向 Mirror 对象的指针作为参数,并将其分配给对象的内部指针;它将 bool 设置为 false。添加成员函数test():如果对象的指针非零,则返回通过指针调用的test()的值。如果指针为零,则返回布尔值。现在创建五个 cpp 文件,每个文件都包含 Mirror 标头。第一个 cpp 文件使用默认构造函数定义了一个全局 Mirror 对象。第二个文件将第一个文件中的对象声明为extern,并使用第二个构造函数定义了一个全局Mirror对象,带有指向第一个对象的指针。继续这样做,直到到达最后一个文件,该文件也将包含一个全局对象定义。在该文件中,main() 应该调用 test() 函数并报告结果。如果结果为真,请找出如何更改链接器的链接顺序并更改它,直到结果为假。