この質問から(まだ解決されていません)この新しい問題に遭遇したので、ここで例を示しました:
//main.cpp
int main() {
return 0;
}
//file1.cpp
#include "b.h"
B b;
//file2.cpp
#include "a.h"
A a;
//a.h
#pragma once
#include<iostream>
#include "b.h"
extern B b;
class A
{
public:
A(){ std::cout << "a cotr" << std::endl;b.Use(); }
};
//b.h
#pragma once
#include<iostream>
class B
{
public:
B() { std::cout << "b ctor"<<std::endl; };
void Use() { std::cout << "use b" << std::endl; }
};
g ++ 6.3.0では、出力は次のようになります。(g ++ -o test file1.cpp file2.cpp prac.cpp -std = c ++ 11)
a cotr
use b
b ctor
したがって、コード例からは、そのような保証はないようであり、おそらく未定義の動作ですか?標準がこれについて述べているところはどこにありますか?(この状況は少し異なるため、重複しているとは思いません:の初期化ではa
、b
のメンバー関数を呼び出します。)
オブジェクトは、そのメンバー関数を呼び出す前に初期化されることが保証されていますか?
いいえ、無効なオブジェクトに対して非静的メンバー関数を呼び出さないのはあなたの仕事です。これには、オブジェクトがまだ作成されていないか、すでに破棄されているオブジェクトnullptr
として渡すことが含まれますが、これらに限定this
されません。この状況の解決策の1つは、関数内にグローバルオブジェクトではなく静的ローカルオブジェクトを持ち、それへの参照/ポインターを返すことです。その方法はまだ破壊順序に問題がありますが、問題の少なくとも半分はなくなっています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加