我可以在同一个.CPP文件中声明和定义静态类变量吗

Can I declare and define static class variable in a same .CPP file?

本文关键字:静态 定义 静态类 类变量 声明 同一个 CPP 文件 我可以      更新时间:2023-10-16

在.cpp中,我有一个类声明和定义。当我尝试使用建议的方法之一初始化字符串数组时,会出现错误。

class week
{
public:
    week();
    static const char * const days[];
}
week::week()
{
 const char * const week::days = {"monday" , "tuesday" "etc..."}
}

我得到了天变量的重新定义错误,这是有效的。但我想知道为了在同一个.cpp文件中工作,我需要对上面的代码做什么更改。

这里我并没有使用头文件来声明类。类声明和定义都位于SAME.cpp文件中。

感谢

在C++文件中,您应该编写

const char * const week::days[] = {"monday", ...};
//                            ^^  <- don't forget these      

它应该在全局范围内,而不是在构造函数中。构造函数应该与静态成员初始化无关。

您会想要做这样的事情:

class week
{
public:
    week();
    static const char * const days[];
};
week::week()
{
}
const char * const week::days[] = {"monday" , "tuesday", "etc..."};
void main()
{
    week w;
}

更新:

看看我纠正的几个错误:

  1. 在类末尾添加;
  2. 将静态变量days的初始化移到类外部,并在初始化语句中添加了一个;

静态变量在全局作用域中初始化(在类定义之后)。构造函数仅用于初始化当前对象实例的成员变量。

关于将所有代码放在同一个(.cpp)文件中的问题,答案是肯定的。您可以将所有代码放在同一个文件中并进行编译,它就会工作
但不建议这样做
按照惯例,头文件(.h)包含声明,而(.cpp)包含定义。

因此,重构上面的代码,我得到了以下带有相应代码的文件:

文件:week.h

class week
{
public:
    week();
    static const char * const days[];
};

文件:week.cc(或week.cpp)

#include "week.h"
const char * const week::days[] = {"monday" , "tuesday", "etc..."};
week::week()
{
}

文件:main.cc(或main.cpp)

#include "week.h"
void main()
{
    week w;
}

您需要在类函数之外声明静态数据成员。

例如:

class week
{
public:
    week();
    static const char * const days[];
};
char * week::days[] = {"monday" , "tuesday" "etc..."};
week::week()
{
}

如果将类定义拆分为头文件(.h/.hpp)

,也会出现同样的问题

作为一般准则,除非明确指定成员函数为内联函数,否则永远不要在头文件中定义它们(这意味着从编译器的角度来看,它们也应该是内联函数的好候选者。)

当您使函数内联时,它取决于编译器是否出于某些优化原因选择使其内联。内联声明函数有两种方法。

1) Implicit:-
Class Data
{
 public:
   void send()      
   {
   }
};
2) Explicit:-
class Data
{
  void send();
};
inline void Data::send()
{
}