【问题标题】:C++ Static Class Member InitializingC++ 静态类成员初始化
【发布时间】:2015-05-18 07:39:50
【问题描述】:

我是 C++ 新手,仍处于学习阶段,所以这对您来说可能是一个简单且可能愚蠢的问题;(

从板上的其他问题和答案中,我了解到在 cpp 文件中初始化私有静态类数据成员以及其他成员函数定义是习惯和首选。

但是,是否可以将成员函数初始化为 main.cpp 中的全局变量?既然所有对象都应该共享一个静态数据成员,为什么不在那里初始化它呢? (我会认为在 main 本身初始化它,但我猜这会吐出编译错误)

您能否解释一下这在技术上是不合理的还是只是没有按照惯例进行。由于静态数据成员无论如何都在类 cpp 文件中初始化为全局变量,所以我看不出在主 cpp 中初始化它会失败的原因。请指教。

【问题讨论】:

标签: c++ class static member


【解决方案1】:

假设下面的头文件class.hpp

#pragma once // sort of portable
struct C // to make the example shorter.
{
    static int answer;
};

以及以下源文件class.cpp

#include "class.hpp"
// nothing here

以及以下主要源文件main.cpp

#include <iostream>
#include "class.hpp"
int C::answer = 42;
int main()
{
    std::cout << "And the answer is " << C::answer << "." << std::endl;
}

现在,编译class.cpp -&gt; class.objmain.cpp -&gt; main.obj,并链接class.obj main.obj -&gt; executable。它按预期工作。但是假设,你想出了不同的项目(anothermain.cpp),它将使用相同的class.hpp

#include "class.hpp"
int main()
{
    std::cout << "And the answer is " << C::answer << "." << std::endl;
}

经过相同的编译过程会导致链接错误

未解析的外部符号“public: static int C::answer”

所以,回答你的问题。有可能的。链接器不关心哪个目标文件包含该值的定义(只要它只定义一次)。但是,我不会推荐它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 2023-03-18
    • 2021-10-21
    • 1970-01-01
    相关资源
    最近更新 更多