使用使析构函数私有化[重复]

2024-05-11

在下面的代码中,我没有得到

  1. 将 MyClass::~MyClass() 析构函数设为私有的用途/原因/好处?
  2. 由于析构函数是私有的,所以最后如何调用析构函数。
 // 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;
}

//主.cpp

#include "myclass.h"
#include <iostream>
int main() {

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



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

    return 0;
}

//输出

Constructor
Hello
Destructor

// Edit

如果我将 myclass 的构造函数公开并删除 GetInstance() 函数。

> MyClass obj;
> obj.Display();

然后弹出如下错误

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

'

问题: C++ 如何处理静态情况?是不是凌驾于私人行为之上?


在共享库的情况下,它可能会出现以限制应用程序可以执行的操作。

使用共享库的应用程序使用导出函数来获取对象的句柄,并且必须显式调用另一个导出函数来销毁该对象。

它就像一个有充分理由的使用合同 - 它存在于 DLL/so 的堆或数据段中 - 因此应用程序无法释放它)。

该导出的函数又会调用您的静态函数。就像是:

extern "C" __declspec(dllexport) MyClass* CreateMyClass() {
    return &MyClass::GetInstance();
}


extern "C" __declspec(dllexport) void     DestroyMyClass(MyClass* handle) {
    delete handle; // assumes destructor isn't private. 
    // if destructor is private, you can't use delete since it calls the destructor, which is .... private!
    handle->Destroy(); // A member function that calls the private destructor
}

MyClass::Destroy() {
    if (it_is_safe_to_destroy_the_class)
        ~Destroy();
}

但是,那么 Destroy() 成员函数应该是公共的,所以这个例子还不够好(它是私有构造函数的一个很好的理由)

本质上,您希望限制您的类的用户可以通过私有构造和/或销毁来执行的操作。 您通过静态变量“创建”实例,而不是它们,并允许它们仅使用功能(公共接口)而不使用其他任何东西。 同样,当你认为它安全时,你就销毁它。

(编辑:我之前的回答主要针对私人建设,因此我添加了一个更明确的私人破坏示例)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用使析构函数私有化[重复] 的相关文章

随机推荐

  • Kafka Streams 内部数据管理

    在我的公司 我们广泛使用 Kafka 但出于容错的原因 我们一直使用关系数据库来存储多个中间转换和聚合的结果 现在我们正在探索 Kafka Streams 作为一种更自然的方式来做到这一点 通常 我们的需求非常简单 其中一个例子是 监听输入
  • 如何抑制 IE9 window.close() 确认消息

    应用 window close 函数后 IE9 会引发 您正在查看的网页正在尝试关闭 消息 有没有办法在不更改应用程序代码的情况下 而是通过更改一些特定于 IE 的注册表项来抑制此消息 如果窗口不是由脚本打开的 IE 不允许在没有确认的情况
  • iPhone X 上横向的 UICollectionView

    当 iPhone X 横向使用时 您应该检查 safeAreaInsets 以在左侧和右侧制作适当大的装订线 UITableView 有新的insetsContentViewsToSafeArea属性 默认 true 自动将单元格内容保留在
  • BATCH - 从 Windows 命令行获取显示分辨率并设置变量

    echo off set h wmic desktopmonitor get screenheight set w wmic desktopmonitor get screenwidth echo h echo w pause 而不是得到
  • 将嵌套循环计算转换为 Numpy 以加速

    我的Python程序的一部分包含以下代码段 其中一个新的网格 是根据旧网格中找到的数据计算的 网格是二维浮点数列表 该代码使用了三个 for 循环 for t in xrange 0 t step for h in xrange 1 hei
  • Android Wear - 在没有 WearableListenerService 的情况下从 Wear 接收消息?

    我正在开发一款适用于 Android Wear 的应用程序 它可以在手机上启动活动 一切都很好 但我不想依赖手机上不断运行的后台服务来接收此消息 理想情况下 我会让 WearableListenerService 与应用程序同时启动 并保持
  • IIS 7.5 中未显示 ASP.NET 功能

    我在 IIS 7 5 中遇到问题 其中 ASP NET 功能部分未显示在我的 Web 应用程序上 我的环境 Windows 2008 R2 SP1 IIS 7 5 7 5 7600 NET Framework 4 0 我的问题与此处发布的问
  • 如何将 T-SQL 中的结果连接到列中?

    我正在处理一个查询 它应该给我这样的结果 Name Surname Language Date James Hetfield en gb fr 2011 01 01 Lars Ulrich gb fr ca 2011 01 01 但我的选择
  • 导入错误:无法导入名称“PandasError”

    我对在 Mac 上运行的 Python 3x 非常陌生 当前使用 python 金融的 senddex 教程 尝试运行以下脚本 import datetime as dt import matplotlib pyplot as plt fr
  • CSS 选择器在哪个方向进行验证?

    我记得不久前在网上看过一个视频 是雅虎工程师的演讲 他在视频中提到浏览器从右到左读取 CSS 选择器 而不是从左到右 意义 body header links a实际上会拉出页面上的所有锚点 过滤那些具有类父级的锚点links有一个班级的家
  • 我可以将这个 XAML 块变成可重用的“控件”吗?

    我有一个Grid 在那个网格中 我有这个
  • R Shiny UI 子选项复选框?

    我有一个基本的 RShiny 应用程序 它有一个反应式复选框 它根据复选框中选择的数据 df 列 绘制时间序列数据 我当前的代码生成一个带有复选框输入的 UI 如下所示 Load R packages library shiny libra
  • 在tomcat中显示Spring-security的SQL错误

    我使用 spring security 框架创建了一个 Web 应用程序 我设置了一个数据库来存储用户及其角色 但 tomcat 给出以下错误 17 sep 2010 11 56 14 org springframework beans f
  • 如何为 asp.net MVC 5 配置 StructureMap

    我遇到以下错误 我的设置与 asp net mvc 4 类似 没有为此对象定义无参数构造函数 描述 安 当前网页执行期间发生未处理的异常 要求 请查看堆栈跟踪以获取有关的更多信息 错误及其在代码中的起源 异常详细信息 System Miss
  • 如何在视图中调用 Grails 服务?

    简单的问题 我有一个服务类 比方说helpersService 和一个方法def constructURI params 如何从模板视图调用此方法 我尝试了以下代码但没有成功 img src 但我得到以下结果 No signature of
  • Java Swing透明JPanel问题

    我有一个 JLayeredPane 其中添加了 3 个 JPanel 我将 JPanel 设为透明 未设置背景并 setOpaque false 我在 JPanel 上绘制线条 只有最后添加的 JPanel 上的线条可见 其他 JPanel
  • 如何从 SQL Azure V11 升级到 V12?

    我正在使用 V11 SQL Azure 在此阶段 我不想升级包含我当前所有 QA 和生产数据库的现有 SQL 服务器 从逻辑上讲 为 V12 创建新的 SQL Server 设置似乎更安全 然后以某种方式将 V11 数据库实例从我的 V11
  • 使用 Java 的 OpenId 提供者/服务器

    我正在尝试使用 OpenId 服务增强现有的 Java Web 应用程序 以便登录用户可以使用我的 Web 应用程序作为 OpenId 提供程序登录另一个启用 OpenId 的应用程序 My first attempt was to use
  • 如何为新的 eclipse (neon) java 项目初始化 git

    我安装了 eclipse Neon 的新副本 并在一个新的闪亮工作区中创建了一个新的 gradle java 项目 将 git 添加到聚会中的最佳实践是什么 我读到在项目目录中初始化 git 是真是个坏主意 https stackoverf
  • 使用使析构函数私有化[重复]

    这个问题在这里已经有答案了 在下面的代码中 我没有得到 将 MyClass MyClass 析构函数设为私有的用途 原因 好处 由于析构函数是私有的 所以最后如何调用析构函数 myclass h include