C++ 如何在C++;?

C++ 如何在C++;?,c++,class,definition,C++,Class,Definition,可能重复: 我的C++经历预先添加了字符串类,所以我从某些方面开始。 我正在为类定义头文件,并希望为url创建一个静态常量。我正在尝试这样做,方法如下: #include <string> class MainController{ private: static const std::string SOME_URL; } const std::string MainController::SOME_URL = "www.google.com"; #包括 类主控制器{

可能重复:

<>我的C++经历预先添加了字符串类,所以我从某些方面开始。

我正在为类定义头文件,并希望为url创建一个静态常量。我正在尝试这样做,方法如下:

#include <string>
class MainController{
private:
    static const std::string SOME_URL;
}

const std::string MainController::SOME_URL = "www.google.com";
#包括
类主控制器{
私人:
static const std::string SOME_URL;
}
const std::string MainController::SOME_URL=“www.google.com”;
但这给了我一个重复的定义在链接


我怎样才能做到这一点呢?

你应该把
常量std::string MainController::SOME_URL=“www.google.com”定义到单个源文件中,而不是在头文件中。

在头文件中定义类:

//file.h
class MainController{
private:
    static const std::string SOME_URL;
}
然后,在源文件中:

//file.cpp
 #include "file.h"

const std::string MainController::SOME_URL = "www.google.com";

你得把线接上

const std::string MainController::SOME_URL = "www.google.com";
在cpp文件中,而不是标头中,因为。您不能在类中直接初始化它,这是因为
std::string
不是整数类型(如int)

P>可选地,根据您的使用情况,您可能会考虑不使用静态成员,而是使用匿名命名空间代替…p> 移动

const std::string MainController::SOME_URL = "www.google.com";

到cpp文件。如果在标题中有它,则包含它的每个.cpp都将有一个副本,并且在链接过程中会出现重复符号错误。

dup@Nawaz在实践中。形式上,不同翻译单元中的多个定义是未定义的行为,因此编译器可以使其工作。(或者做其他任何事情,但是“让它工作”在C语言中是一个常见的实现,而构造函数并没有参与其中。)@JamesKanze:你想说什么?这和静态成员的类型有关吗?@Nawaz:我知道OP不是这么做的。OP提到他在C++中生疏了。我只是添加了一些关于如何初始化字符串(将其放入cpp中)的信息,如果它是int,则可以直接在类主体中初始化,并且在某些情况下匿名名称空间可能有用。@Nawaz它与类型无关。在单独的翻译单元中有多个定义是未定义的行为,允许编译器使其工作。传统上,C编译器会这样做(出于历史原因);C++编译器没有。可能是因为对于较旧的链接器,在进行动态初始化时很难使其工作。在实践中,用C++编译器,你会得到一个错误。@纳瓦兹,我并不是想说你错了;所有的意图和目的,今天在C++中,你是对的。我只是加入了一些额外的信息:历史和标准,但没有什么可以改变你所写内容的影响。我想我不太明白的是,我的标题栏中有这些。这解决了问题,我只是不明白为什么…@Thom,标题保护并没有解决问题,因为每个翻译单元(cpp文件)都包含标题,所以每个翻译单元最后都有一个同名字符串的“副本”,结果是每个翻译单元都编译正确。但是,当链接多个翻译单元时,它们具有相同的符号(字符串),并且由于符号链接而引发链接错误。