Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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++ C+中的等效值+;Java静态对象类的定义_C++ - Fatal编程技术网

C++ C+中的等效值+;Java静态对象类的定义

C++ C+中的等效值+;Java静态对象类的定义,c++,C++,来自Java背景,我习惯于创建类a,然后创建类B来保存类a的特定静态实例化,以便在整个程序中使用。一些示例Java代码: public class Color { public int r; public int g; public int b; public Color(int r, int g, int b) { this.r = r; this.g = g; this.b = b; } } publ

来自Java背景,我习惯于创建类a,然后创建类B来保存类a的特定静态实例化,以便在整个程序中使用。一些示例Java代码:

public class Color {
    public int r;
    public int g;
    public int b;

    public Color(int r, int g, int b) {
        this.r = r;
        this.g = g;
        this.b = b;
    }
}

public class Colors {
    public static final Color WHITE = new Color(255, 255, 255);
    public static final Color BLACK = new Color(0, 0, 0);
}

我尝试了一个名为
Colors
class Color
,其中名为
struct Colors
,但由于
Colors
在我包含它的每个文件中都被重新实例化,我得到了链接器错误。在C++中,最好的方法是什么?还是我试图用错误的方式解决这个问题?C++中的

< P>是一个实际的包含。这意味着,与Java导入相反,代码实际上是复制的

现在多次包含文件时,代码会多次出现。这就是为什么您需要保护头代码不被复制两次

解决方案1:将以下内容写入头文件的第一行:

#pragma once
解决方案2(更便携且广泛推荐):

关于你的问题还有一些想法:

  • 不要使用类来封装constexpr值。这在C++中不是必需的。在java中,类之外不能有任何东西,但是C++中,这是完全合法的。只需声明符号并在类外的源文件中定义它。不过,您应该在自己的命名空间中声明它,以避免名称冲突

  • 也许enum类更接近您真正想要的


  • 假设您的问题实际上是您呈现的颜色问题,这可能是实现它的最简单方法:

    struct Color
    {
        int r, g, b;
    
        Color(int r, int g, int b)
        {
            this->r = r;
            this->g = g;
            this->b = b;
        }
    
        static Color WHITE() { return {255, 255, 255}; }
        static Color BLACK() { return {0, 0, 0}; }
    };
    


    如果出于某种原因需要能够引用静态对象(即,每个命名颜色应该只有一个静态对象实例),可以在标题(
    Colors.h
    )中声明它们,并在关联的编译单元(
    Colors.cpp
    )中初始化它们,但这有点麻烦,也意味着编译器不能内联/折叠编译时常量等(至少没有链接时优化)。如果常量发生变化,它确实可以防止重新编译包含
    Colors.h
    的文件


    此方法将是一个(不是更好的)中间地带,其中每种颜色仍有一个静态对象实例,但您可以将其保留在标题中:


    但是请注意,尽管进行了优化,编译器仍无法确定
    bar()
    是否应始终返回
    255
    。相反,它必须在每次调用中检查静态常量是否已经初始化,如果没有,则初始化它们(这需要一个线程安全锁!)

    <代码> conxPRP可能有帮助。这不是任何接近合法C++的地方。你的实际尝试在哪里?使用const <代码> const 听起来好像你可以使用。这将告诉你C++语法是什么,它和java不一样,还是我试图用错误的方式解决问题?它们不属于单独的类,而是属于同一类或同一命名空间;甚至java通常也不会创建一个与我记忆中的不同的类,因为静态的最终颜色实例将在颜色类中,这是毫无疑问的。我怀疑这就是为什么你们会收到反对票。我收到反对票,因为我是少数几个仔细阅读问题的人之一。他说:“但是我得到了链接器错误,因为颜色在我包含它的每个文件中都被重新实例化。”这就是我的回答。可能确实是这样。你的解决方案似乎太复杂了,用常量对象代替静态函数没有问题:@UnholySheep如果你可以把东西放在一个额外的名称空间中,使用名称空间是一个很好的实践,尽管我的示例在没有它的情况下也可以工作:我的意思是“在名称空间中,而不是在/a类中”。你能在课堂上做同样的事情吗?如果我有不同的颜色表示法和类似于
    template TColor bar(){return TColor::WHITE;}
    的模板,则名称空间解决方案将无法工作。我知道,这个例子很琐碎,超出了问题的范围,但我以前确实遇到过这种问题。
    struct Color
    {
        int r, g, b;
    
        Color(int r, int g, int b)
        {
            this->r = r;
            this->g = g;
            this->b = b;
        }
    
        static Color WHITE() { return {255, 255, 255}; }
        static Color BLACK() { return {0, 0, 0}; }
    };