次のコードがあります
#include <vector>
#include <iostream>
class A{
private:
std::vector<int> x;
A(){
// here is a code to open and initialize several devices
// it is allowed to be called once only!!!
std::cout << "constructor called" << std::endl;
};
virtual ~A(){
// here is a code to close several devices
// it is allowed to be called once only!!!
std::cout << "destructor called" << std::endl;
};
public:
static A & getA(){
static A* singleton = new A;
std::cout << "singleton got" << std::endl;
return *singleton;
};
};
int main(int argc, char** argv){
A a = A::getA();
return(0);
}
多くの推奨事項によると、デストラクタはプライベートであり、プログラムの最後に一度だけ呼び出されます。
しかし、私はコンパイラエラーがあります:
Test.cpp: In function 'int main(int, char**)':
Test.cpp:12:10: error: 'virtual A::~A()' is private
Test.cpp:29:19: error: within this context
Test.cpp:12:10: error: 'virtual A::~A()' is private
Test.cpp:29:19: error: within this context
当然のことながら、コンストラクタやデストラクタを公開することができ、そのようなエラーは発生しません。ただし、両方が一度だけ呼び出されるようにする必要があります。
どのように?