【问题标题】:Array definition in class - in header or cpp file?类中的数组定义 - 在头文件或 cpp 文件中?
【发布时间】:2022-12-21 10:14:36
【问题描述】:

我想在类中定义数组:

H:

class A
{
    protected:
        static const int TABLE[];
}

cpp:

const int A::TABLE[5] = {1, 2, 3, 4, 5};

这应该是一个 const 数组,所有类型 A 的对象都将使用。

  1. 我应该在头文件中定义它吗?这方面的最佳做法是什么?

  2. 我缝制了以前的问题,有些人建议用“外部”来定义它。像这样:

    H:

    class A
    {
    protected:
    extern const int TABLE[];
    }
    

    cpp:

    const int A::TABLE[5] = {1, 2, 3, 4, 5};
    

    它不是静态的?

    ..................................

【问题讨论】:

  • 要么在一个源文件中定义它,要么在类内的标头中使用inline
  • 首先,数组是A的每个单独对象实例的单独成员,还是应该由A的所有对象实例共享?这决定了是否使用static
  • “这个的最佳实践是什么......”基于意见。
  • 如果您打算经常更改这些值,则只需重新编译 cpp 文件是一个优势。但是,如果这些值在编译时有用,则您需要在标头中使用它们。
  • 不相关,我也建议std::array<int, 5>而不是int[5]

标签: c++


【解决方案1】:

这里有两个选项。我们可以在 C++17 及更高版本中使用 inline 关键字在类中定义它,或者在类中声明它,然后在类中提供类外定义确切地在源文件上。

方法一

这里我们在 C++17 中使用 inline

标题.h

#pragma once 

class A
{
    protected:
//------vvvvvv---------------------------->inline used here with c++17
        inline static const int TABLE[] = {1, 2, 3, 4, 5};
};

Demo method 1


方法二

这里我们在类内部声明它,然后在同一个源文件中的类外部定义它。

标头

#pragma once 

class A
{
    protected:
        static const int TABLE[5];
};

源文件

#include "header.h"

const int A::TABLE[5] = {1, 2, 3, 4, 5};

Demo method 2


请注意,我建议使用 std::array 而不是使用内置数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多