Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++如何在CPP错误中与外部共享常数:指定的存储类_C++_Compiler Errors_Constants_Extern - Fatal编程技术网

C++如何在CPP错误中与外部共享常数:指定的存储类

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

我有一个头文件,在其中我用extern声明了一些常量:

#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,那么将其放入全局名称空间可能就是您想要的。