1

プライベート デストラクタに関連する1 つの質問 ( Destructor private の使用) を尋ねましたが、以下の質問で終了しましたが、正確な答えはまだわかりません。

質問:

プライベート デストラクタを持つクラスのオブジェクトを作成すると、プライベート デストラクタが呼び出されるのはなぜですか? しかし、通常のオブジェクトを作成するときはそうではありません。

ケースⅠ

// myclass.h

#include <iostream>

class MyClass {
public:
    static MyClass& GetInstance();
    void Display();
private:
    MyClass();
    virtual ~MyClass();
};

MyClass::MyClass() {
    std::cout << "Constructor " << std::endl;
}

MyClass::~MyClass() {
    std::cout << "Destructor" << std::endl;
}

MyClass& MyClass::GetInstance() {
    static MyClass _instance;
    return _instance;
}

void MyClass::Display() {
    std::cout << "Hello" << std::endl;
}
// main.cpp

#include "myclass.h"
#include <iostream>

int main() {

    MyClass::GetInstance().Display(); //case1



    std::cout << "main finished!" << std::endl;

    return 0;
}

// output
Constructor 
main finished
Destructor.

ケースⅡ

// myclass.h

#include <iostream>

class MyClass {
public:
    void Display();
    MyClass();
    virtual ~MyClass();
};

MyClass::MyClass() {
    std::cout << "Constructor " << std::endl;
}

MyClass::~MyClass() {
    std::cout << "Destructor" << std::endl;
}

MyClass& MyClass::GetInstance() {
    static MyClass _instance;
    return _instance;
}

void MyClass::Display() {
    std::cout << "Hello" << std::endl;
}
// main.cpp

#include "myclass.h"
#include <iostream>

int main() {

    MyClass testObj;



    std::cout << "main finished!" << std::endl;

    return 0;
}

// Error
1>e:\programs\cpp_test\src\main.cpp(38): error C2248: 'MyClass::MyClass' : cannot access private member declared in class 'MyClass'
1>          e:\programs\cpp_test\static_single_test.h(11) : see declaration of 'MyClass::MyClass'
1>          e:\programs\cpp_test\static_single_test.h(6) : see declaration of 'MyClass'
1>e:\programs\cpp_test\src\main.cpp(38): error C2248: 'MyClass::~MyClass' : cannot access private member declared in class 'MyClass'
1>          e:\programs\cpp_test\static_single_test.h(12) : see declaration of 'MyClass::~MyClass

編集

「ヒープベースのオブジェクトのみが必要。

http://en.wikibooks.org/w/index.php?title=More_C%2B%2B_Idioms%2FRequiring_or_Prohibiting_Heap-based_Objects&diff=2567824&oldid=2202430&utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+MoreCppIdiomsウィキブック+%28Wikibooks+-+Changes+related+to+ %22もっと+C%2B%2B+イディオム%22+[en]%2 9

4

5 に答える 5

2

静的関数はクラスの関数であるためprivate、このクラスの関数にアクセスできます。そのため、1 つのケースが期待どおりに機能します。

Instance最初のケースでは、このクラスのコンストラクターにアクセスできるfunction で object が作成されます。オブジェクトは宣言さstaticれているため、オブジェクトはクラス関数で作成されるため、プログラムの最後でのみ破棄されます-デストラクタへのアクセスがあります。

2 番目のケースでは、クラス関数ではない関数型のオブジェクトを作成しようとしているため、c-tor/d-tor にアクセスできませMyClassん。main

于 2013-10-21T11:00:42.017 に答える
1

main静的ストレージ期間を持つオブジェクトは、 からの復帰後または への呼び出し後に破棄されstd::exitます。規格のセクション 3.6.3 では、この破壊について説明しています。C++11 から、3.6.3、

初期化されたオブジェクト (つまり、有効期間が開始されたオブジェクト) のデストラクタは、静的記憶域期間があり、メインから戻った結果、および std::exit を呼び出した結果として呼び出されます。

デストラクタのアクセシビリティ (public/protected/private) については言及されていないことに注意してください。適切なデストラクタは、期間と呼ばれます。

アクセシビリティをカバーするのはセクション 12.4 です。C++11 12.4 パラグラフ 11 (C++03 のパラグラフ 10) は、次のように述べています。

クラス型またはその配列のオブジェクトが宣言されていて、宣言の時点でクラスのデストラクタにアクセスできない場合、プログラムは不正な形式です。

デストラクタは静的関数MyClass::GetInstance()でアクセスできるため、その関数で宣言されたブロック スコープの静的変数は問題ありません。ではデストラクタにアクセスできないmain()ため、 で宣言された自動変数はmain問題ありません。

于 2013-10-21T12:01:50.937 に答える
0

あなたが達成しようとしていることはわかりませんが、エラーは明らかです:

最初のケースでは、オブジェクトを構築する行はクラス内にあるため、すべてのプライベート メソッドにアクセスできます。

2 番目のケースでは、構築はクラスの外部にあるため、プライベート メンバーへのアクセスは不可能です。

于 2013-10-21T11:02:16.720 に答える