1. 删除构造函数定义
在你的头文件中(命名风暴.h) 你有definedNamedStorm的默认构造函数:
NamedStorm(){};
但你真正想要的只是构造函数宣言:
NamedStorm();
定义和声明之间的区别在于,声明仅告诉编译器存在某个函数(例如:NamedStorm 构造函数),而定义提供了该函数的完整主体。
请注意,如果您仅指定函数的声明,而忘记进行定义,您将得到undefined reference
链接器错误。
进一步阅读:http://www.cprogramming.com/declare_vs_define.html http://www.cprogramming.com/declare_vs_define.html
2.修正第二个构造函数
NamedStorm::NamedStorm(string sName, double wSpeed, string sName, double sPress)
这是行不通的,因为您尝试传递两个具有相同名称的参数。我猜你想命名第二个sCat
,因为您在构造函数定义中使用了此类变量。正确版本:
NamedStorm::NamedStorm(string sName, double wSpeed, string sCat, double sPress)
3. 运算符
如果您阅读了第一部分,那么您应该知道有什么问题operator<<
目前为止。您仅提供了宣言,不是定义.
你可以这样填写:
std::ostream& operator<<(ostream& out, NamedStorm& namedStorm)
{
out << namedStorm.getName();
return out;
}
请注意,声明也已更改 - 该函数现在采用NamedStorm&
代替const NamedStorm&
,因为getName
方法未声明为const
。您可以阅读有关const
方法here https://stackoverflow.com/questions/751681/meaning-of-const-last-in-a-c-method-declaration.
4.定义静态类变量
您在类中声明的每个静态变量(仅int stormCount
在你的情况下)必须被定义。将此行放入您的NamedStorm.cpp file:
int NamedStorm::stormCount = 0;
应用这些更改后,您的代码应该可以正常工作。然而,您仍然可以阅读许多语言的细微差别来改进您的代码。他们之中有一些是:
1. 将函数参数作为值传递与 const 引用传递
好读这里:在 C++ 中,按值传递还是按常量引用传递更好? https://stackoverflow.com/questions/270408/is-it-better-in-c-to-pass-by-value-or-pass-by-constant-reference
2. 返回对象副本与 const 引用的函数
这个问题也有一个很好的答案:返回 const 引用是否更有效 https://stackoverflow.com/questions/275795/is-it-more-efficient-to-return-a-const-reference
3. 小心“使用命名空间”
再次,所以:为什么“使用命名空间 std”被认为是不好的做法? https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice
If you really想要使用它,never在头文件中使用它,因为它会影响包含它的所有文件。