4

編集

わかりました、私は数時間再び少し読みましたが、最終的に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;
}
4

1 に答える 1

4

1. コンストラクター定義を削除する

ヘッダー ファイル ( NamedStorm.h )で、NamedStorm の既定のコンストラクターを定義しました。

NamedStorm(){};

しかし、あなたが本当に望んでいたのはコンストラクタ宣言だけです:

NamedStorm();

定義と宣言の違いは、宣言は何らかの関数 (NamedStorm コンストラクターなど) があることをコンパイラに伝えるだけであるのに対し、定義はこの関数の完全な本体を提供することです。

関数の宣言のみを指定し、定義を行うのを忘れると、undefined referenceリンカー エラーが発生することに注意してください。

さらに読む: http://www.cprogramming.com/declare_vs_define.html

2. 2 番目のコンストラクターを修正する

NamedStorm::NamedStorm(string sName, double wSpeed, string sName, double sPress)

同じ名前の 2 つの引数を渡そうとしているため、これは機能しません。sCatコンストラクター定義でそのような変数を使用しているため、2番目の名前を付けたかったと思います。正しいバージョン:

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&getNameconstconst

4. 静的クラス変数を定義する

クラスで宣言するすべての静的変数 (int stormCountあなたの場合のみ)を定義する必要があります。次の行をNamedStorm.cppファイルに挿入します。

int NamedStorm::stormCount = 0;

これらの変更を適用すると、コードは正常に動作するはずです。ただし、コードを改善するために読むことができる言語のニュアンスはまだたくさんあります。それらのいくつかは次のとおりです。

1. 関数の引数を値と const 参照として渡す

ここでよく読んでください: C++では、値渡しまたは定数参照渡しのほうが良いですか?

2. オブジェクトのコピーと const 参照を返す関数

この質問にも SO に関する良い答えがあります: Is it more effective to return a const reference

3.「名前空間の使用」に注意

繰り返しますが、SO: 「名前空間 std を使用する」ことが悪い習慣と見なされるのはなぜですか?

本当に使用したい場合は、ヘッダーファイルで使用しないでください。これを含むすべてのファイルに影響します。

于 2013-07-23T20:43:11.003 に答える