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

时间:2014-09-26 12:41:14

标签: c++ visual-c++

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

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

week::week()
{
 const char * const week::days = {"monday" , "tuesday" "etc..."}
}

我正在获取有效的days变量的重定义错误。但是我希望我需要对上面的代码进行哪些更改才能在同一个.cpp文件中工作。

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

由于

4 个答案:

答案 0 :(得分:2)

在C ++文件中你应该写

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

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

答案 1 :(得分:1)

你想要做这样的事情:

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 的初始化移到类之外,并将;添加到初始化语句中。
  3. 静态变量在全局范围内初始化(在类定义之后)。构造函数仅用于初始化当前对象实例的成员变量。

    关于将所有代码放在同一个(.cpp)文件中的问题,答案是肯定的。您可以将所有代码放在同一个文件中并进行编译,这样就可以了 但是不建议这样做 按照惯例,header(.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;
    }
    

答案 2 :(得分:0)

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

例如:

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

char * week::days[] = {"monday" , "tuesday" "etc..."};

week::week()
{
}

如果将类定义拆分为头文件(.h / .hpp),您将看到同样的问题

答案 3 :(得分:0)

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

当你使函数内联时,由于某些优化原因,它依赖于编译器是否选择它来内联。有两种方式可以内联声明函数。

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