修改
好的,我已经做了几个小时的阅读,我想我终于明白了c ++ OOP(至少是基础知识)。我决定一次重写整个程序和代码并进行更多测试。我想这次我更多地缩小了错误。
NamedStorm.h
#include <string>
#include <iostream>
#ifndef NAMEDSTORM_H_INCLUDED
#define NAMEDSTORM_H_INCLUDED
// NEVER use using namespce in header, use std instead.
class NamedStorm{
private:
std::string stormName;
std::string stormCategory;
double maxWindSpeed;
double stormPressure;
static int stormCount;
public:
// Constructor
NamedStorm(std::string, double, std::string, double);
NamedStorm(std::string);
// Destructor
~NamedStorm();
// Get functions
int getStormCount();
double getStormPressure();
double getWindSpeed();
std::string getStormCategory();
std::string getName();
// Set functions
static void displayOutput();
static void sortByNames();
static void sortByWindSpeed();
static void getAverageWindSpeed();
static void getAverageStormPressure();
};
#endif // NAMEDSTORM_H_INCLUDED
NamedStorm.cpp
// CPP => Function definition
#include <string>
#include "NamedStorm.h"
using namespace std;
// Defining static variables
int NamedStorm::stormCount = 0;
// Constructor definition
NamedStorm::NamedStorm(std::string sName, double wSpeed, std::string sCat, double sPress){
stormName = sName;
windSpeed = wSpeed;
stormCategory = sCat;
stormPressure = sPress;
stormCount++;
}
NamedStorm::NamedStorm(std::string sName){
stormName = sName;
stormCount++;
}
// Destructor definition
NamedStorm::~NamedStorm(){}
// Get (Accessor) function definition
int NamedStorm::getStormCount(){
return stormCount;
}
double NamedStorm::getStormPressure(){
return stormPressure;
}
string NamedStorm::getStormCategory(){
return stormCategory;
}
string NamedStorm::getName(){
return stormName;
}
// Set (Mutator) function definition
void NamedStorm::displayOutput(){}
void NamedStorm::sortByNames(){}
void NamedStorm::getAverageStormPressure(){}
void NamedStorm::getAverageWindSpeed(){}
void NamedStorm::getWindSpeed(){}
的main.cpp
#include <iostream>
#include <string>
#include "NamedStorm.h"
using namespace std;
NamedStorm storm[5]; // Error occurs here
int main(){
// NamedStorm Chris("Chris", 70.0, "T.S", 990.0);
// storm[0] = Chris;
return 0;
}
答案 0 :(得分:4)
<强> 1。删除构造函数定义
在头文件( NamedStorm.h )中,你有定义 NamedStorm的默认构造函数:
NamedStorm(){};
但你真正想要的只是构造函数声明:
NamedStorm();
定义和声明之间的区别在于声明只告诉编译器有一些函数(例如:NamedStorm构造函数),而定义提供了这个函数的完整主体。
请注意,如果仅指定函数的声明,并且忘记进行定义,则会出现undefined reference
链接器错误。
进一步阅读: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。运营商&lt;&lt;
如果您阅读第一部分,那么您现在应该知道operator<<
有什么问题。您只提供了声明,而不是定义。
你可以这样填写:
std::ostream& operator<<(ostream& out, NamedStorm& namedStorm)
{
out << namedStorm.getName();
return out;
}
请注意,声明也会更改 - 该函数现在需要NamedStorm&
而不是const NamedStorm&
,因为getName
方法未声明为const
。您可以阅读const
方法here。
<强> 4。定义静态clas变量
您在班级中声明的每个静态变量(在您的情况下仅为int stormCount
)必须定义。将此行放入 NamedStorm.cpp 文件中:
int NamedStorm::stormCount = 0;
应用这些更改后,您的代码应该可以正常工作。但是,您仍然可以阅读许多语言细微差别来改进您的代码。其中一些是:
<强> 1。将函数参数作为值与const引用传递
好的阅读:Is it better in C++ to pass by value or pass by constant reference?
<强> 2。返回对象副本与const引用的函数
这个问题在SO上也有一个很好的答案:Is it more efficient to return a const reference
第3。小心“使用命名空间”
再次,SO:Why is "using namespace std" considered bad practice?
如果确实想要使用它,从不在头文件中使用它,因为它会影响包含它的所有文件。