繁体   English   中英

构造函数中未定义的全局常量

Global constants undefined in constructor

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有两个常量文件:

// constants.h
extern const std::string testString;

// constants.cpp
const std::string testString = "defined!";

程序初始化时,我需要在对象的构造函数中使用此常量,但是它是未定义的。 构造函数中的代码是:

MyClass::MyClass() {
   printf("Value of test string: %s", testString.c_str());
}

// output:
Value of test string: (null)

类和常量在同一个命名空间中定义,并且不会给我一个错误,即常量未定义。 初始化对象后(例如,使用硬编码的字符串),它可以正常工作并打印出常量的值(“ defined!”)。 原始常量在构造函数中似乎可以正常工作。

我认为这与当时未初始化的常量有关(因此来自.cpp文件)。 你知道为什么会这样吗? 在程序完全初始化之后,是否会进行extern const的初始化?

先感谢您

编辑:

请注意, string类型是为了简化问题,因此将其转换为char不是一个选择,因为我也对拥有其他非基本类型感兴趣。

显示此问题的程序的最小脏例代码:

// constants.h
extern const std::string testString;

// constants.cpp
#include "constants.h"

const std::string testString = "defined!";

// MyClass.h
class MyClass {

public:
    MyClass();
    virtual ~MyClass();
};

// MyClass.cpp
#include "MyClass.h"
#include "constants.h"

MyClass::MyClass() {
   printf("Value of test string: %s\n", testString.c_str());
}

MyClass::~MyClass() {}

// main.cpp
#include "MyClass.h"
#include "constants.h"

MyClass my;            // undefined string (outputs null)

int main(int argc, char** argv) {
    MyClass my;        // defined string
    return 0;
}

编辑2:

在这种情况下,解决方案是在头文件中定义静态内联函数,如@Brian@LightnessRacesinOrbit建议的那样。 他们都为最终答案做出了贡献。

这是代码:

inline std::string getTestString() { return "defined!"; }

这允许将非constexpr类型作为全局常量。

1 个回复

constants.cpp转换单元内,将在随后定义的任何非局部变量之前初始化testString 翻译单元之间 ,我们有所谓的“静态初始化顺序惨败”; 除了constants.cpp之外的任何转换单元都不能假设testString已初始化,直到main开始执行之后,因此,如果它尝试在其自身的非本地初始化之一期间读取其值,则它可能会观察到零初始化的std::string对象,其行为未定义。

我建议避免这个问题(这也是我以前的工作场所所遵循的规则)的建议是,如果您必须具有全局常量,请尽可能使它们成为constexpr ,并非常警惕任何非constexpr全局变量。 std::string不是constexpr (尚未),但是老式的char数组可以工作:

// constants.h
inline constexpr char testString[] = "defined!";

// constants.cpp
// no need to define `testString` here!
2 角返回未定义的构造函数中的函数

我正在尝试使用angular创建触发器,但是当我从api获得响应时,它将返回undefined 。 这是我的global-search.ts文件: 如果在getProfessionals()方法中,我这样做: 它向我返回了一个对象(是正确的),但是在doSearch()方法 ...

3 在构造函数中定义的未定义变量

嗨,我似乎在我的代码上出现了一个错误,似乎是我没有初始化变量,但是在构造函数中初始化了veriabile: 这是我的代码: 错误会在第一个if语句中引发,我该如何解决? ...

2012-10-24 15:06:16 2 445   php
5 GraphViewSeries构造函数未定义

我正在尝试使用graphview显示图形。 我收到错误:“未定义构造函数GraphViewSeries(String,int,GraphView.GraphViewData [])” 这是我拥有的一部分: 我不确定是怎么了。 有人可以帮忙吗? ...

6 构造函数未定义

打包in.citydoor.imports.catalog.tools; 公共类ProductVo { } 打包in.citydoor.imports.catalog.tools; 导入java.util.ArrayList; 公共类CatFeedBean { ...

7 对我的构造函数的未定义引用

我有一个简单的课程,我无法实例化,我不知道为什么......请帮助我! ------- ------- Test.cpp的 ------- meteo.h --------- ------- -------- meteo.cpp 我收到错误:“未定义引用`Meteo ...

2015-02-28 17:17:21 1 112   c++
8 未定义DropShadow构造函数

我是JavaFX的新手,并且正在关注本教程https://wiki.eclipse.org/Efxclipse/Tutorials/Tutorial1 ,以熟悉它。 我正在尝试为我的文本设置一个DropShadow,它表示无法识别构造函数。 但是,本教程使用的是准确的代码行,没有错误,并 ...

9 构造函数Geocoder()未定义

我不断使用以下代码获取未定义的Geocoder。 我想简单地从经纬度获得一个地方的地址。 行Geocoder geocoder =新地址Geocoder(this,Locale.ENGLISH); 总是回来没有定义。 ...

2011-04-29 18:44:04 1 2443   android
10 Java构造函数未定义?

好的,我正在为学校做作业,我设置了我的主类,还有另一个名为Transaction的类。 在我的主要课程中,我有: 并强调了Transaction:它表示构造函数未定义。 为什么?! Transaction类看起来像这样: 它看起来应该只是起作用,但事实并非如此。 即使 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM