gpt4 book ai didi

c++ - 需要确保构造函数/析构函数被调用一次。但是 "error: destructor is private"

转载 作者:行者123 更新时间:2023-11-30 01:25:00 24 4
gpt4 key购买 nike

我有以下代码

#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);
}

根据许多建议,析构函数是私有(private)的,只能在程序结束时调用一次。
但是我有编译器错误:

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. 你缺少复制构造函数的实现
  2. 你正在复制单例对象
  3. 你的析构函数是私有(private)的(因为你正在复制单例对象,你需要在公共(public)部分有析构函数)

您可以通过不复制对象来简单地解决它:

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

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

单例应该保持单个实例,因此(如建议的那样)最好的方法是删除复制和移动构造函数。


因为你只需要调用一次构造函数和析构函数,那么你需要使用meyers singleton .这意味着将您的功能更改为此:

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

};

关于c++ - 需要确保构造函数/析构函数被调用一次。但是 "error: destructor is private",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13043950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com