オブジェクトは、そのメンバー関数を呼び出す前に初期化されることが保証されていますか?

scottxiao

この質問から(まだ解決されていません)この新しい問題に遭遇したので、ここで例を示しました:

//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

したがって、コード例からは、そのような保証はないようであり、おそらく未定義の動作ですか?標準がこれについて述べているところはどこにありますか?(この状況は少し異なるため、重複しているとは思いません:の初期化ではabのメンバー関数を呼び出します。)

スラバ

オブジェクトは、そのメンバー関数を呼び出す前に初期化されることが保証されていますか?

いいえ、無効な​​オブジェクトに対して非静的メンバー関数を呼び出さないのはあなたの仕事です。これには、オブジェクトがまだ作成されていないか、すでに破棄されているオブジェクトnullptrとして渡すことが含まれますが、これらに限定thisされません。この状況の解決策の1つは、関数内にグローバルオブジェクトではなく静的ローカルオブジェクトを持ち、それへの参照/ポインターを返すことです。その方法はまだ破壊順序に問題がありますが、問題の少なくとも半分はなくなっています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

現在の標準では、完全なオブジェクトの初期化で例外がスローされたときに、サブオブジェクトのデストラクタを呼び出すことが保証されていますか?

分類Dev

部分的に定義された静的オブジェクトの初期化されていないメンバーは、0に初期化されることが保証されていますか?

分類Dev

そのクラスのオブジェクトが作成されたときにコンストラクターがメモリを取得する外部で関数がクリアされていますか。関数が呼び出されていません

分類Dev

エラー:Firestoreはすでに初期化されています。settings()を呼び出すことができるのは、Firestoreオブジェクトの他のメソッドを呼び出す前に1回だけです。

分類Dev

Deallocは、オブジェクトを作成したのと同じスレッドで呼び出されることが保証されていますか?

分類Dev

標準のC ++ 11は、関数に渡される一時オブジェクトが関数呼び出しの前に作成されることを保証しますか?

分類Dev

オブジェクトが適切に初期化されていることを確認できるのはいつですか。たとえば、init()が他のメソッドの前に呼び出された場合などです。

分類Dev

ブレース付き初期化リストで初期化されたオブジェクトを返すときに、コンストラクターとデストラクタの呼び出しのペアが1つ保証されますか?

分類Dev

ループ内のローカルオブジェクトのデストラクタは、次の反復の前に呼び出されることが保証されていますか?

分類Dev

ここでデストラクタが呼び出された理由と、そのオブジェクトデストラクタを呼び出した後にオブジェクトメンバー関数を呼び出す方法を教えてください。

分類Dev

関数の戻り値でオブジェクトを初期化するときにコピーコンストラクターが呼び出されない

分類Dev

コンストラクターまたはinitブロックから呼び出されたオーバーライドされた抽象関数で変数を初期化するときに変数が正しく初期化されない

分類Dev

0-アトミックの初期化は値メンバーを0に設定することが保証されていますか?

分類Dev

SleepExは、保留中のすべての完了コールバックがタイムアウト前に呼び出されることを保証しますか?

分類Dev

この関数を呼び出そうとすると、NoneTypeオブジェクトを呼び出せないというエラーメッセージが表示されるのはなぜですか?

分類Dev

Lua C API関数がクラスメンバーとして呼び出されたのか、それともテーブルから関数として呼び出されたのかを判断するにはどうすればよいですか?

分類Dev

オブジェクトがメンバー関数にバインドされているときに、std :: functionがデストラクタを呼び出すのはなぜですか?

分類Dev

中断されたスレッド上のオブジェクトに対して代入関数を呼び出すことは許可されていますか?

分類Dev

中断されたスレッド上のオブジェクトに対して代入関数を呼び出すことは許可されていますか?

分類Dev

静的クラス変数は、静的メンバー関数を最初に呼び出す前に初期化されていますか?

分類Dev

コントローラからモデルメソッドを呼び出す「非オブジェクトのメンバー関数を呼び出す...」が、ビューから呼び出されると機能します

分類Dev

Javaグローバル変数は最初に初期化されることが保証されていますか?

分類Dev

関数の戻り値は自動オブジェクトなので、破壊されることが保証されていますか?

分類Dev

オブジェクトをパラメーターとして渡すときに、デストラクタが呼び出されているのにコンストラクションが呼び出されていないのはなぜですか?

分類Dev

useEffectに渡された関数は、並行モードであっても、コンポーネントが呼び出された後に少なくとも1回呼び出されることが保証されていますか?

分類Dev

C ++はオブジェクトを参照によって関数に渡し、そのコンストラクターが呼び出されます

分類Dev

TypeScript:識別された共用体のオブジェクトを、それらを呼び出すことができる関数にマップする方法は?

分類Dev

一時オブジェクトのサブオブジェクトは、返却時に移動されることが保証されていますか?

分類Dev

グローバル オブジェクトは、すべてのスレッド ローカル ストレージ オブジェクトが破棄された後に破棄されることが保証されていますか?

Related 関連記事

  1. 1

    現在の標準では、完全なオブジェクトの初期化で例外がスローされたときに、サブオブジェクトのデストラクタを呼び出すことが保証されていますか?

  2. 2

    部分的に定義された静的オブジェクトの初期化されていないメンバーは、0に初期化されることが保証されていますか?

  3. 3

    そのクラスのオブジェクトが作成されたときにコンストラクターがメモリを取得する外部で関数がクリアされていますか。関数が呼び出されていません

  4. 4

    エラー:Firestoreはすでに初期化されています。settings()を呼び出すことができるのは、Firestoreオブジェクトの他のメソッドを呼び出す前に1回だけです。

  5. 5

    Deallocは、オブジェクトを作成したのと同じスレッドで呼び出されることが保証されていますか?

  6. 6

    標準のC ++ 11は、関数に渡される一時オブジェクトが関数呼び出しの前に作成されることを保証しますか?

  7. 7

    オブジェクトが適切に初期化されていることを確認できるのはいつですか。たとえば、init()が他のメソッドの前に呼び出された場合などです。

  8. 8

    ブレース付き初期化リストで初期化されたオブジェクトを返すときに、コンストラクターとデストラクタの呼び出しのペアが1つ保証されますか?

  9. 9

    ループ内のローカルオブジェクトのデストラクタは、次の反復の前に呼び出されることが保証されていますか?

  10. 10

    ここでデストラクタが呼び出された理由と、そのオブジェクトデストラクタを呼び出した後にオブジェクトメンバー関数を呼び出す方法を教えてください。

  11. 11

    関数の戻り値でオブジェクトを初期化するときにコピーコンストラクターが呼び出されない

  12. 12

    コンストラクターまたはinitブロックから呼び出されたオーバーライドされた抽象関数で変数を初期化するときに変数が正しく初期化されない

  13. 13

    0-アトミックの初期化は値メンバーを0に設定することが保証されていますか?

  14. 14

    SleepExは、保留中のすべての完了コールバックがタイムアウト前に呼び出されることを保証しますか?

  15. 15

    この関数を呼び出そうとすると、NoneTypeオブジェクトを呼び出せないというエラーメッセージが表示されるのはなぜですか?

  16. 16

    Lua C API関数がクラスメンバーとして呼び出されたのか、それともテーブルから関数として呼び出されたのかを判断するにはどうすればよいですか?

  17. 17

    オブジェクトがメンバー関数にバインドされているときに、std :: functionがデストラクタを呼び出すのはなぜですか?

  18. 18

    中断されたスレッド上のオブジェクトに対して代入関数を呼び出すことは許可されていますか?

  19. 19

    中断されたスレッド上のオブジェクトに対して代入関数を呼び出すことは許可されていますか?

  20. 20

    静的クラス変数は、静的メンバー関数を最初に呼び出す前に初期化されていますか?

  21. 21

    コントローラからモデルメソッドを呼び出す「非オブジェクトのメンバー関数を呼び出す...」が、ビューから呼び出されると機能します

  22. 22

    Javaグローバル変数は最初に初期化されることが保証されていますか?

  23. 23

    関数の戻り値は自動オブジェクトなので、破壊されることが保証されていますか?

  24. 24

    オブジェクトをパラメーターとして渡すときに、デストラクタが呼び出されているのにコンストラクションが呼び出されていないのはなぜですか?

  25. 25

    useEffectに渡された関数は、並行モードであっても、コンポーネントが呼び出された後に少なくとも1回呼び出されることが保証されていますか?

  26. 26

    C ++はオブジェクトを参照によって関数に渡し、そのコンストラクターが呼び出されます

  27. 27

    TypeScript:識別された共用体のオブジェクトを、それらを呼び出すことができる関数にマップする方法は?

  28. 28

    一時オブジェクトのサブオブジェクトは、返却時に移動されることが保証されていますか?

  29. 29

    グローバル オブジェクトは、すべてのスレッド ローカル ストレージ オブジェクトが破棄された後に破棄されることが保証されていますか?

ホットタグ

アーカイブ