C++ 全局变量和初始化顺序

2023-12-11

比方说,我有以下简单的代码:

Main.cpp

#include "A.h"

// For several reasons this must be a global variable in the project
A a1;

int _tmain(int argc, _TCHAR* argv[])
{
    // Another stuff
    return 0;
}

A.h

#pragma once

#include <string>

class A
{
private:
    // The following works normal if we use simple types like int and etc.
    static std::string myString;

public:
    A();
};

A.cpp

#include "stdafx.h"
#include "A.h"

// This executes after A::A(), so we are losing all the modifyed content
// If we skip the ="test" part, the string is going to be empty
std::string A::myString = "test";

A::A()
{
    // Here myString == ""
    myString += "1";
}

问题很明显:在这种情况下,我不能在类 A 的构造函数中使用静态变量,因为它们不保存更改。虽然我需要它们来处理一些数据。

请给我建议一个解决方案。


听起来您正在尝试强制静态初始化发生before构造函数被调用。上次我遇到这个问题时,唯一可靠的解决方法是将 static 包装在函数中。

将声明更改为返回字符串引用的函数。

static std::string& myString();

将定义更改为如下函数:

std::string& A::myString() {
     static std::string dummy = "test";
     return dummy;
}

将您的构造函数更改为:

myString() += "1";

我目前手边没有 MSFT 编译器,因此您可能需要稍微调整一下,但这基本上会强制静态的按需初始化。

这是一个非常简短的测试编程,演示了它是如何工作的:

#include <string>
#include <stdio.h>


std::string& myString() {
     static std::string dummy = "test";
     return dummy;
}

int main(){
    myString() += "1";
    printf("%s\n", myString().c_str());
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 全局变量和初始化顺序 的相关文章

  • 如何使用最小起订量模拟私有只读 IList 属性

    我试图嘲笑这个列表 private readonly IList
  • C语言中没有循环可以打印数组吗?

    例如 在Python中 如果我们将一个列表作为数组 它会直接用一行代码打印整个数组 有什么办法可以用C语言实现同样的事情吗 简短回答 No 对表格上几乎所有问题的简短回答 用 C 语言做 X 工作能像用 Python 一样简单吗 No 长答
  • c 使用 lseek 以相反顺序复制文件

    我已经知道如何从一开始就将一个文件复制到另一个文件 但是我如何修改程序以按相反的顺序复制它 源文件应具有读取访问权限 目标文件应具有读写执行权限 我必须使用文件控制库 例如 FILE A File B should be ABCDEF FE
  • 为什么我在 WinForms 列表框中得到“System.Data.DataRowView”而不是实际值?

    每当我运行代码并尝试查看highscore我在列表框中得到的只是System Data DataRowView 谁能明白为什么吗 Code MySqlConnection myConn new MySqlConnection connStr
  • 打开位置设置页面或提示用户启用位置

    我一直在绞尽脑汁 徒劳地谷歌搜索 我正在尝试找到一种方法来提示用户通过直接进入设置页面或仅点击屏幕上的 是 来切换位置 我见过的所有代码似乎都不起作用 有人有有效的方法吗 一个详细的例子将不胜感激 谢谢 我对 Xamarin 开发非常陌生
  • PartialView Action 正在调用自身

    我有 MVC 应用程序 它用于从主视图 ProductMaster 将 ProductAreaGrid 列表显示为 PartialView 并且它将在局部视图内将 CreateProductArea 作为 PartialView 我的 Gr
  • 从 Golang 调用 C 函数

    我想在 Golang 中编写控制器逻辑并处理 json 和数据库 同时在 C 中使用我的数学处理模型 在我看来 调用 C 函数的开销必须尽可能低 就像设置寄存器 rcx rdx rsi rdi 一样 执行一些操作fastcall 并获取 r
  • 根据 Active Directory 策略检查密码[重复]

    这个问题在这里已经有答案了 我有一个允许用户更改其 AD 密码的前端 有没有办法获取特定用户及其属性 长度 复杂性 的密码策略 例如细粒度 有没有办法根据此特定策略检查字符串 xyz121 编辑 我不想检查活动目录中存储的当前密码 我想检查
  • 为什么 rand() 总是返回相同的值? [复制]

    这个问题在这里已经有答案了 可能的重复 在C中生成随机数 https stackoverflow com questions 3067364 generating random numbers in c 使用 rand 生成随机数 http
  • 使用 catch all 字典属性将 json 序列化为对象

    我想使用 JSON net 反序列化为对象 但将未映射的属性放入字典属性中 是否可以 例如给定 json one 1 two 2 three 3 和 C 类 public class Mapped public int One get se
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE
  • 如何在 ASP.NET Core 项目中使用 MStest 测试 Ok() 结果

    我正在使用 MStest 来测试我的控制器 我想测试这个动作 HttpGet Name GetGroups public async Task
  • 文本框中“结束编辑”的事件

    我正在 winform c 中使用文本框 并使用文本在数据库中进行查询 但每次文本更改时 我都需要不断查阅文本框的文本 因此 对于这些 我使用 KeyUp 但这个活动太慢了 文本框编辑完成后是否会触发任何事件 我考虑完成2个条件 控制失去焦
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow
  • 如何阻止 Control-I 在 CoreWindow 范围内的 UWP 文本框中插入选项卡?

    当我在 UWP 应用程序中有一个 TextBox 时 对我来说 奇怪的行为 在 Windows 10 中创建通用的空白应用程序 UWP 应用程序 使用以下代码将文本框添加到默认网格
  • 模板定义中的友元函数

    我的问题有点相关this https stackoverflow com questions 1297609 overloading friend operator for template class one 我想重载某些类的运算符 te
  • 使用 WinAPI 连接禁用的显示设备

    我的问题是启用禁用的监视器ChangeDisplaySettingsEx 我想这不是火箭科学 但经过一番挖掘后 它看起来仍然是不可能的 我找到了一种根据找到的 Microsoft 代码示例禁用所有辅助显示器的方法here https msd
  • C# 和断点 - 这里有魔术师吗?

    我有这个 public static void ByLinkText string text for var i 0 i lt 50 i try Setup Driver FindElement By LinkText text Click
  • 有没有办法在 C# 中仅通过文件名查找文件?

    我们现在使用绝对路径或相对路径在 C 应用程序中查找文件 如果文件位于当前工作目录下或 路径 之一下 有没有办法仅通过名称查找文件 使用绝对路径不好 使用相对路径也不够好 因为我们可能通过重命名或移动项目文件夹来更改项目结构 如果我们的代码
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS

随机推荐

  • 最好的自动换行算法? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 自动换行是现代文本编辑器的必备功能之一 如何处理自动换行 最好的自动换行算法是什么 如果文本有几百万行 如何才能快速自动换行 为什么我需要解决方案 因为我的项目必须绘制具有各种缩放级别的文
  • 根据容器宽度动态调整文本大小

    我正在研究响应式设计 并且有一些显示 h3 当浏览器窗口宽度减小时 我想缩小的标签 初始设置 基于 960px 宽度 正文字体大小设置为 14px h3标签的字体大小为40px 包含div的宽度为230px 这是我为 javascript
  • 如何在 Google Drive Api v3 中进行部分下载?

    文档说here您需要使用 Range 标头Range bytes 500 999 My code def downloadChunkFromFile file id start length headers Range bytes form
  • 以同样的方式打乱多个 javascript 数组

    我有两个数组 var mp3 sing mp3 song mp3 tune mp3 jam mp3 etc var ogg sing ogg song ogg tune ogg jam ogg etc 我需要对两个数组进行洗牌 以便它们以相
  • 检索 AngularJS 应用程序名称

    如何在 AngularJS 中检索当前应用程序的名称 我的意思是ng app foo value 我搜索了 API 文档 但找不到任何对此的参考 我的解决方案实际上我已经找到了这样的解决方案 angular element ng app a
  • 有没有办法在一定的空闲时间后将 GKE 集群的大小调整为 0 个节点?

    我有一个 GKE 集群 我希望它位于 0 个节点 扩展到 3 个节点来执行任务 然后在一定的空闲时间后 缩小到 0 个节点 有没有办法做到这一点 由于集群中运行着系统 Pod GKE 集群永远无法缩小到 0 在 kube system 命名
  • 按多个属性对 js 对象进行分组

    在下面的示例中 我有一个对象数组 我按其属性中的 2 个对它们进行分组 基于https stackoverflow com a 40142591 var arr id 1 tags main yearCode 2018 id 2 tags
  • 如何键入深度嵌套的字典和列表结构[重复]

    这个问题在这里已经有答案了 在给定的 d d1 1 2 d2 this is tricky tough 1 2 me 问题要求我打印 me 我试图理解字典中给定的键和值来查找基于该键的任何关系 但无法这样做 在进一步潜水之前是否应该了解某些
  • 证明内容 flex-end 不适用于 IE

    Flex end适用于chrome和firefox 但不适用于ie 请执行以下代码 flex container display flex flex wrap nowrap background color DodgerBlue flex
  • 如何使用 JavaScript 和 PHP 将画布图像保存到服务器?

    我正在努力使用 JavaScript 和 PHP 将画布图像保存到服务器 我已经尝试了 JS 和 PHP 的多个示例 但总是失败 关于如何将图像数据发送到 PHP 脚本 base64 blob FormData 的建议存在冲突 并且我不确定
  • 简单的 Html DOM 缓存

    我正在使用 Simple HTML DOM 来抓取 经许可 一些网站 我基本上抓取了大约 50 个不同网站的统计数据 这些数据每天更新大约四次 正如您可以想象的那样 进行抓取需要时间 因此我需要通过进行一些缓存来加快该过程 我的愿景是 DA
  • 使用相当于 AutoFixture 'With' 的匿名值进行广义 Func 包装

    在基于 AutoFixture 的测试中 我尝试尽可能清晰地表达以下内容 当我经过时
  • jquery根据选择值填充表中的文本输入

    我有一个表单 其中包含一个名为 Client ID 的选择以及一些其他文本输入 我需要的是 当用户选择 Client ID 时 我的字段 Address1 Address 2 等应该填充数据库查询的结果 如下所示 SELECT Addres
  • 拟合回归曲面的 3D 图

    我正在尝试制作 3D 图表来绘制拟合回归曲面 我见过以下例子 使用 Matplotlib 在 3d 中绘制线性模型 将散点图与曲面图相结合 3 维数据的最佳拟合曲面 然而 第一个非常过时 不再工作 第二个是相关的 但我在生成值时遇到了一些麻
  • swift 中的 kCGImageAlphaNone 未解析的标识符

    我正在尝试使用 Swift 中的 CoreImage 将图像 纹理 对于 SpriteKit 转换为灰度 我找到了这个答案 https stackoverflow com a 17218546 836501我尝试将其转换为适用于 iOS7
  • 如何从 ASPX.VB 函数内部调用 ASSX?

    我需要从我用 ASHX 制作的 API 中获取一个值 通常它是从 javascript 调用的 但我需要在 ASP NET 中正确调用它 我认为这应该不是问题 但我不确定语法 那么你有几个选择 您可以将 ASHX 中的代码重构为共享库中的代
  • 从 SQL Server 的 XML 执行计划中提取数据

    我的最终目标是从缓存的执行计划中自动提取所有引用的列 这将帮助我们跟踪我们计划的 SSRS 报告集使用的所有列 感兴趣的 XML 数据如下所示
  • 在flutter中拖动widget时如何实现定位线?

    我试图在拖动时获取定位线 紫色线 请参阅该附件以了解有关该问题的更多信息 线条是用canvas drawPoints 在 和 的paint 方法 您可以更改它来绘制虚线 现在 带有黑色实线 它看起来像这样 class FooResizer
  • Canvas getImageData 和 putImageData 部分加载图像

    这是我的代码 我正在上传图像并使用如下 gt var canvas document createElement canvas gt var context canvas getContext 2d gt context drawImage
  • C++ 全局变量和初始化顺序

    比方说 我有以下简单的代码 Main cpp include A h For several reasons this must be a global variable in the project A a1 int tmain int