【问题标题】:C/C++ private array initialization in the header file头文件中的 C/C++ 私有数组初始化
【发布时间】:2009-02-06 16:06:44
【问题描述】:

我有一个名为 Cal 的类,它是 .cpp 和 .h 的对应对象

头文件有

class Cal {
    private:
        int wa[2][2];

    public:
        void do_cal();
};

.cpp 文件有

#include "Cal.h"
void Cal::do_cal() {
   print(wa) // where print just itterates and prints the elements in wa
}

我的问题是如何初始化数组 wa ?我似乎无法让它工作。

我试过了:

int wa[2][2] = {
                {5,2},
                {7,9}
               };

在头文件中,但我收到错误消息说我不能这样做,因为它违反了 iso..something。

还尝试在构造函数中初始化数组wa,但这也没有用。我错过了什么?

谢谢

【问题讨论】:

    标签: c++ arrays header initialization


    【解决方案1】:

    如果它可以是静态的,您可以在 .cpp 文件中对其进行初始化。在类声明中添加 static 关键字:

    class Cal {
        private:
            static int wa[2][2];
        public:
            void do_cal();
    };
    

    并在 .cpp 文件的文件范围内添加:

    #include "Cal.h"
    int Cal::wa[2][2] = { {5,2}, {7,9} };
    void Cal::do_cal() {
       print(wa) // where print just itterates and prints the elements in wa
    }
    

    如果你从不改变它,这会很好用(连同使它成为 const)。但是,您只能获得与您班级的每个实例共享的一个。

    【讨论】:

      【解决方案2】:

      您不能在类声明中初始化数组元素。我最近试图找到一种方法来做到这一点。根据我了解到的情况,您必须在初始化函数中执行此操作,一次一个元素。

      Cal::Cal{
         wa[0][0] = 5;
         wa[0][1] = 2;
         wa[1][0] = 7;
         wa[1][1] = 9;
      }
      

      有可能(并且很可能)有更好的方法来做到这一点,但根据我上周的研究,这是使用多维数组的方法。 如果有人有更好的方法,我很感兴趣。

      【讨论】:

        【解决方案3】:

        你不能轻易做到。如果您不想像Perchik's answer 那样单独指定每个元素,您可以创建一个静态数组和memcpy(对于非平凡的数组大小,这可能会更快):

        namespace
        {
            const int default_wa[2][2] = {{5, 2}, {7, 9}};
        }
        
        Cal::Cal
        {
            memcpy(&wa[0][0], &default_wa[0][0], sizeof(wa));
        }
        

        【讨论】:

        • memcpy 在这里很危险。如果将来有人更改了一个数组的维度或类型,而没有在另一个数组中反映这些更改...
        • 没错,但使用任何其他解决方案都会遇到同样的问题。在这种情况下,您可以轻松地在此处输入 assert(sizeof(wa) == sizeof(default_wa)) 以防止出现这种情况。
        • 如果您像这样定义数组大小,可以确保它们始终匹配:int default_wa[][2] = {{ 5, 2 }, { 7, 9 }}; int wa[count(default_wa)][count(default_wa[0])]; 和 #define count(ARRAY) ((sizeof (ARRAY))/(sizeof (ARRAY[0])))
        • 好点克里斯托夫,我以前做过。我讨厌 #defining count() 每次我需要它 - 应该是一个内置功能。
        • 还应该指出,您可以在构造函数中使用静态,而不是将默认值放在外面的命名空间中。但前提是您不需要内联构造函数。它增强了可读性。
        猜你喜欢
        • 2020-07-08
        • 1970-01-01
        • 1970-01-01
        • 2016-11-28
        • 2011-05-24
        • 1970-01-01
        • 2013-05-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多