BruceEckelによる「ThinkinginC++」の助けを借りて、C ++を学習し、演習32、第10章で立ち往生しています。問題は、オブジェクトm5に対して呼び出されたMirror :: test()がfalseを返すリンク順序を変更する方法です。これが私のコードです。
mirror.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_
タスク
one.cpp
#include "mirror.h"
Mirror m1;
two.cpp
#include "mirror.h"
extern Mirror m1;
Mirror m2 (&m1);
three.cpp
#include "mirror.h"
extern Mirror m2;
Mirror m3 (&m2);
等々。ついに、
five.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()はtrueを返します。タスクは、リンクの順序を変更する必要があることを示しています。m5.test()はfalseを返します。私は使用しようとしました:
init_priority(priority)
標準C++では、名前空間スコープで定義されたオブジェクトは、特定の変換単位での定義と厳密に一致する順序で初期化されることが保証されています。翻訳ユニット間の初期化は保証されません。ただし、GNU C ++を使用すると、ユーザーは、相対優先度(現在、101から65535までの範囲にある定数積分式)を指定することにより、init_priority属性を使用して名前空間スコープで定義されたオブジェクトの初期化の順序を制御できます。数値が小さいほど、優先度が高くなります。
しかし、運はありません。
完全な演習テキスト:
ヘッダーファイルで、2つのデータメンバー(Mirrorオブジェクトへのポインターとbool)を含むクラスMirrorを作成します。2つのコンストラクターを指定します。デフォルトのコンストラクターはboolをtrueに初期化し、Mirrorポインターをゼロに初期化します。2番目のコンストラクターは、引数としてMirrorオブジェクトへのポインターを取り、それをオブジェクトの内部ポインターに割り当てます。boolをfalseに設定します。メンバー関数test()を追加します。オブジェクトのポインターがゼロ以外の場合、ポインターを介して呼び出されたtest()の値を返します。ポインタがゼロの場合、ブール値を返します。次に、5つのcppファイルを作成します。各ファイルには、ミラーヘッダーが含まれています。最初のcppファイルは、デフォルトのコンストラクターを使用してグローバルミラーオブジェクトを定義します。2番目のファイルは、最初のファイルのオブジェクトをexternとして宣言し、2番目のコンストラクターを使用してグローバルミラーオブジェクトを定義します。最初のオブジェクトへのポインタを使用します。グローバルオブジェクト定義も含まれる最後のファイルに到達するまで、これを繰り返します。そのファイルで、main()はtest()関数を呼び出し、結果を報告する必要があります。結果がtrueの場合は、リンカーのリンク順序を変更して、結果がfalseになるまで変更する方法を確認してください。