C++如何在CPP错误中与外部共享常数:指定的存储类
我有一个头文件,在其中我用extern声明了一些常量:C++如何在CPP错误中与外部共享常数:指定的存储类,c++,compiler-errors,constants,extern,C++,Compiler Errors,Constants,Extern,我有一个头文件,在其中我用extern声明了一些常量: #ifndef CONSTANTS_H #define CONSTANTS_H #include <string> class Constants { public: Constants(){} extern const std::string DELIMITER; extern const std::string FILENAME; extern co
#ifndef CONSTANTS_H
#define CONSTANTS_H
#include <string>
class Constants
{
public:
Constants(){}
extern const std::string DELIMITER;
extern const std::string FILENAME;
extern const int BLUCAR;
extern const int REDCAR;
extern const int EMPTY;
extern const int SPARSE_LIM;
protected:
private:
};
#endif // CONSTANTS_H
为什么编译器给我错误:为“DELIMITER”指定了存储类 首先,他们似乎不是班级成员。你使用extern的方式看起来像是你打算让它们免费的。可能在名称空间中。把他们带出那个班 然后,当您定义它们时,省去外部 在这种情况下,它意味着在别处找到这个变量。你不想在别处找到它。就在这里
记住,对于静态对象定义,您也会这样做 首先,他们似乎不是班级成员。你使用extern的方式看起来像是你打算让它们免费的。可能在名称空间中。把他们带出那个班 然后,当您定义它们时,省去外部 在这种情况下,它意味着在别处找到这个变量。你不想在别处找到它。就在这里
记住,对于静态对象定义,您也会这样做 我认为您要么希望在类中使用静态成员,要么使用名称空间而不是类,要么将常量放在全局名称空间中 对于静态成员:
class Constants
{
public:
Constants(){}
static const std::string DELIMITER;
static const std::string FILENAME;
static const int BLUCAR;
static const int REDCAR;
static const int EMPTY;
static const int SPARSE_LIM;
protected:
private:
};
在您的源文件中
const std::string Constants::DELIMITER = ",";
const std::string Constants::FILENAME = "cars.csv";
const int Constants::BLUCAR = 1;
const int Constants::REDCAR = 2;
const int Constants::EMPTY = 0;
const int Constants::SPARSE_LIM = 5;
然而,看起来您的类更像是一个名称空间而不是一个类,因为创建实例没有任何意义
但还有另一种选择。您甚至可能不想使用类或名称空间,而只是将它们全部放在全局名称空间中:
// header
extern const std::string DELIMITER;
extern const std::string FILENAME;
extern const int BLUCAR;
extern const int REDCAR;
extern const int EMPTY;
extern const int SPARSE_LIM;
// source
const std::string DELIMITER = ",";
const std::string FILENAME = "cars.csv";
const int BLUCAR = 1;
const int REDCAR = 2;
const int EMPTY = 0;
const int SPARSE_LIM = 5;
我认为您要么希望在类中使用静态成员,要么使用名称空间而不是类,要么将常量放在全局名称空间中 对于静态成员:
class Constants
{
public:
Constants(){}
static const std::string DELIMITER;
static const std::string FILENAME;
static const int BLUCAR;
static const int REDCAR;
static const int EMPTY;
static const int SPARSE_LIM;
protected:
private:
};
在您的源文件中
const std::string Constants::DELIMITER = ",";
const std::string Constants::FILENAME = "cars.csv";
const int Constants::BLUCAR = 1;
const int Constants::REDCAR = 2;
const int Constants::EMPTY = 0;
const int Constants::SPARSE_LIM = 5;
然而,看起来您的类更像是一个名称空间而不是一个类,因为创建实例没有任何意义
但还有另一种选择。您甚至可能不想使用类或名称空间,而只是将它们全部放在全局名称空间中:
// header
extern const std::string DELIMITER;
extern const std::string FILENAME;
extern const int BLUCAR;
extern const int REDCAR;
extern const int EMPTY;
extern const int SPARSE_LIM;
// source
const std::string DELIMITER = ",";
const std::string FILENAME = "cars.csv";
const int BLUCAR = 1;
const int REDCAR = 2;
const int EMPTY = 0;
const int SPARSE_LIM = 5;
删除类定义、构造函数和访问修饰符,错误得到解决。这是正确的方法吗?删除类定义、构造函数和访问修饰符,错误就解决了。这是正确的方法吗?我理解你所说的,但是我需要在源文件中定义它们,这样我就可以包含只声明它们的头文件。这样,当我修改一个值时,包含常数.h的文件不需要重新编译。我不知道我说的是否正确,但我明白:@rh0x:Yes,在源文件中定义它们。我向您展示了如何操作。我理解您所说的,但是我需要在源文件中定义它们,以便我可以包含仅在其中声明它们的头文件。这样,当我修改一个值时,包含常数.h的文件不需要重新编译。我不知道我说的是否正确,但我明白:@rh0x:Yes,在源文件中定义它们。我告诉过你怎么做。是的,你是对的!正如“轻量级轨道竞赛”所说的,最好的选择可能是使用名称空间。谢谢大家!@rh0x:请注意,如果希望以某种方式对它们进行分组,例如使用名称空间前缀进行访问,则只需要名称空间。如果您只想使用DELIMITER而不是Constants::DELIMITER,那么将其放入全局名称空间可能就是您想要的。是的,您是对的!正如“轻量级轨道竞赛”所说的,最好的选择可能是使用名称空间。谢谢大家!@rh0x:请注意,如果希望以某种方式对它们进行分组,例如使用名称空间前缀进行访问,则只需要名称空间。如果您只想使用DELIMITER而不是Constants::DELIMITER,那么将其放入全局名称空间可能就是您想要的。