Необходимо убедиться, что конструктор / деструктор вызывается один раз. Но & quot; ошибка: деструктор является частным & quot;

У меня есть следующий код

#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

Конечно, я могу сделать конструктор и / или деструктор публичным и не иметь никаких ошибок, подобных этому. Но я должен быть уверен, что оба они вызваны один раз и только один раз.
Как?

1

Решение

Лучше использовать этот метод одноэлементного конструктора:

static A* getA(){
static A singleton;
std::cout << "singleton got" << std::endl;
return &singleton;
};

Ссылка для получения дополнительной информации Вот

0

Другие решения

В вашей программе есть несколько вещей:

  1. вам не хватает реализации конструктора копирования
  2. вы копируете одноэлементный объект
  3. ваш деструктор является частным (поскольку вы копируете одноэлементный объект, вы должны иметь деструктор в открытом разделе)

Вы можете просто разрешить это, не копируя объекты:

int main(int argc, char** argv){

A &a = A::getA();
}

Одиночный объект должен оставаться в единственном экземпляре, поэтому (как предполагается) наилучшим подходом будет удаление копий и перемещение конструкторов.


Так как вам нужен конструктор и деструктор вызывается только один раз, тогда нужно использовать Майерс Синглтон. Это означает изменение вашей функции на это:

static A & getA(){
static A singleton;
std::cout << "singleton got" << std::endl;
return singleton;

};

4

Очень и очень просто. Не делайте деструктора частным!

Делая единственный конструктор приватным, вы гарантируете, что ваш класс является одноэлементным, нет необходимости также делать деструктор приватным.

1
По вопросам рекламы [email protected]