0

我是 C++ 新手,我一直在练习将旧的 Java 代码翻译成 C++。我遇到了太多的错误,以至于我几乎放弃了希望。我也在尝试修复主文件中的错误,我试图在主文件中调用一个函数,但是我遇到了疯狂的语法错误,我不知道出了什么问题。我已经尝试谷歌搜索并搜索数周来了解如何修复 main.cpp 中的这些错误。如果可以的话,我感谢您的帮助。

// NamedStorm.cpp 
// CPP=> Function definition
#include <iostream>
#include <string>

#include "NamedStorm.h"
using namespace std;

// Makes sure that the displayOutput method work properly
std::ostream& operator<<(ostream& out, const NamedStorm& namedStorm);

// Default Constructor definition (removed parameter due to issues)
NamedStorm::NamedStorm(){

}

// Overload construtor definition
NamedStorm::NamedStorm(string sName, double wSpeed, string sCat,double sPress){
    stormName = sName;
    stormCategory = sCat;
    stormPressure = sPress;
    stormCount++;
}
// Destructor definition
NamedStorm::~NamedStorm(){}

// Accessor function definition
void NamedStorm::displayOutput(NamedStorm storm[]){
    for(int i = 0; i < sizeof(storm); i++){
        cout << storm[i] << "\n";
    }
}

void NamedStorm::sortByNames(NamedStorm storm[]){
    cout << "Sorting array in decsending alphabetical order by names..." << endl;
    for(int k = 1; k < 4; k++){
        for(int i = 0; i < 4 - k; i++){
            if((storm[i].getName()).compare(storm[i+1].getName()) > 0){
                NamedStorm temp;
                temp = storm[i];
                storm[i] = storm[i+1];
                storm[i+1] = temp;
            }
        }
    }
}

void NamedStorm::getAverageWindSpeed(NamedStorm storm[]){
    double averageWSpeed = 0.0;
    double totalWindSpeed = 0.0;

    totalWindSpeed = storm[0].maxWindSpeed
        + storm[1].maxWindSpeed + storm[2].maxWindSpeed + storm[3].maxWindSpeed
        + storm[4].maxWindSpeed;

    averageWSpeed = totalWindSpeed / sizeof(storm);
    cout << "The average max wind speeds of storms: " << averageWSpeed << "mph"<< endl;
}

void NamedStorm::getAverageStormPressure(NamedStorm storm[]){
    double averageSPress = 0.0;
    double totalStormPressure = 0.0;

    totalStormPressure = storm[0].getStormPressure()
        + storm[1].getStormPressure() + storm[2].getStormPressure() + storm[3].getStormPressure()
        + storm[4].getStormPressure();

    averageSPress = totalStormPressure / 5;
    cout << "The Average storm pressure: " << averageSPress << " mb" << endl;
}

int NamedStorm::getStormCount(){
    return stormCount;
}

double NamedStorm::getStormPressure(){
    return stormPressure;
}

double NamedStorm::getWindSpeed(){
    return maxWindSpeed;
}

string NamedStorm::getStormCategory(){
    return stormCategory;
}

string NamedStorm::getName(){
    return stormName;
}


// Mutator function definition

//命名风暴.h

// Header => Function Declaration
#include <iostream>
#include <string>

using namespace std;

#ifndef NAMEDSTORM_H
#define NAMEDSTORM_H

class NamedStorm{
public:
    // Default constructor declaration
    NamedStorm();

    // Overloaded constructor declaration
    NamedStorm(string, double, string, double);

    // Destructor declaration
    ~NamedStorm();

    // Accessor (GET methods in Java) functions declarations (will return variables), use const, when not changing member variables
    static void displayOutput(NamedStorm storm[]);
    static void sortByNames(NamedStorm storm[]);
    static void sortByWindSpeed(NamedStorm storm[]);
    static void getAverageWindSpeed(NamedStorm storm[]);
    static void getAverageStormPressure(NamedStorm storm[]);
    int getStormCount();
    double getStormPressure();
    double getWindSpeed();
    string getStormCategory();
    string getName();

    // Mutator functions (SET methods in Javinese)
    void setStormName();
    void setStormCategory();
    void setMaxWindSpeed();
    void setStormPressure();

private:
    string stormName;
    string stormCategory;
    double maxWindSpeed;
    double stormPressure;
    static int stormCount;
};

// Main.cpp

#include <iostream>
#include <string>

#include "NamedStorm.h"

using namespace std;

NamedStorm storm[5];

int main(){
    NamedStorm Chris("Chris", 70, "Tropical Storm", 990);
    NamedStorm Alberto("Alberto", 45, "Tropical Storm", 1007);
    NamedStorm Gordon("Gordon", 65, "Tropical Storm", 999);
    NamedStorm Isaac("Isaac", 80, "1", 969);
    NamedStorm Ernesto("Ernesto", 50, "Tropical Storm", 1006);

    storm[0] = Alberto;
    storm[1] = Chris;
    storm[2] = Ernesto;
    storm[3] = Gordon;
    storm[4] = Isaac;

    // Error: identifier not found
    displayOutput();
    sortByNames();
    displayOutput();
    sortByWindSpeed();
    displayOutput();
    getAverageStormPressure();
    getAverageWindSpeed();
    return 0;
}
4

1 回答 1

0

我可能会建议将其分解为更小的块(将所有内容注释掉)并一次添加项目 - 确保您在进行时理解每个项目。

在“未找到标识符”上,您似乎正在尝试调用静态类方法,但它没有以类名作为前缀。我认为而不是:

displayOutput();

在 main() 中,你想要:

NamedStorm::displayOutput();

但即使这样也不太正确,因为该方法采用一个风暴数组并且没有提供任何参数。所以我认为正确的签名是:

NamedStorm stormArray[2];
NamedStorm::displayOutput( stormArray );

如果意图是调用全局“displayOutput()”,我看不到一个定义,这样就可以解释这种情况下的错误消息。

第 II 部分 - ostream 运营商 ============================================== ==================

呃……你真的是从顶部开始的!好的,我也无法让它工作 - 我查看了所有这些关于如何正确定义模板等的链接......但问题与错误消息一样简单。引用未解析,因为它不存在!您定义了一个新的运算符,但没有提供实现。您只需要提供实现,如下所示:

// this declares the operator, but it's still undefined
std::ostream& operator<<(std::ostream& out, const NamedStorm& namedStorm);

// add this to *define* it - otherwise it has no body so the linker looks in all the
// obj files, can't find it and gives the unresolved reference error
std::ostream& operator<<(std::ostream& out, const NamedStorm& namedStorm)
{
//print("we needed an implementation!");
return out;
}

现在,在实践中,您不需要在实现之后立即声明,但通常声明将放在 .h 文件中,或者根本没有声明,您可以在 .CPP 文件中包含上述实现。但是没有其他源文件会知道它。

通常认为在项目中添加以下内容是不好的做法:

using namespace std;

相反,更明确地使用您想要的命名空间,例如:

std::string myString = "we know which 'string' this is";

只是说“使用一切......”似乎更容易,直到你花了半天时间追踪一个错误才意识到你甚至没有看正确的课程!

唷..我现在休息;-)

于 2013-06-19T21:45:41.100 回答