在我的.cpp中,我有一个类声明和定义。当我尝试使用建议的方式初始化字符串数组时,会出现错误。
class week
{
public:
week();
static const char * const days[];
}
week::week()
{
const char * const week::days = {"monday" , "tuesday" "etc..."}
}
我正在获取有效的days变量的重定义错误。但是我希望我需要对上面的代码进行哪些更改才能在同一个.cpp文件中工作。
这里我没有使用头文件来声明类。类声明和定义都在SAME .cpp文件中。
由于
答案 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;
}
更新:
看看我纠正的几个错误:
;
days
的初始化移到类之外,并将;
添加到初始化语句中。 静态变量在全局范围内初始化(在类定义之后)。构造函数仅用于初始化当前对象实例的成员变量。
关于将所有代码放在同一个(.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()
{
}