2

私が書いたいくつかの C++ ソース コードは、Visual Studio 2010 を使用してコンパイルし、Windows 7 で正常に実行されました。しかし、XCode 4.4.1 を使用して Mac OS X 10.8 Mountain Lion で試したところ、コンパイルされませんでした。以下に詳述するように修正できましたが、そもそも何が間違っていたのか、なぜ修正が必要なのかを知りたいと思っています。

具体的には、次のクラス宣言を検討してください。

class airline {
    vector <passenger> persons;
    int npassengers;
public:
    airline () {};
    airline (int np);
    ~airline () {};
    // other functions
} ;

airlineint パラメーターを取るコンストラクターは次のとおりです。

airline::airline (int np) {
    npassengers = np;
    persons.resize (npassengers);
    return;
}

Windows マシンでは、これは問題なくコンパイルおよび実行されました。しかし、XCode は、「passenger」用の実行可能なコンストラクターがないと激しく不満を漏らしました。私はパッセンジャー用のデフォルトのコンストラクターを持っているので、それは問題ではありませんでした。このサイトの以前の質問で見つけたものに基づいて、サイズ変更の代わりにpersons.eraseを使用してみましたが、うまくいきませんでした。

persons.vector::resize (npassengers);最終的に、代わりに を使用して、コードを Mac でコンパイルすることができましたpersons.resize (npassengers);。Mac 側でなぜそれを行う必要があったのか、Windows 側では問題なく動作した理由が気になります。

関連する質問は、コードの先頭に置くのは悪い習慣ですかusing namespace std;、代わりに指定する必要がありますstd::coutか? もしそうなら、なぜですか?

知識不足ですが、よろしくお願いします!

編集:ショーンは、乗客のコードを表示することを提案したので、ここに行きます:

class passenger {
    string plast;
    string pfirst;
    int  row;
    char seatno;
    int flightno;
public:
    passenger ();
    passenger(string line );
    passenger (passenger const &rhs);
    ~passenger() {};
} ; 

passenger::passenger (passenger const &rhs) {
    plast = rhs.plast;
    pfirst = rhs.pfirst;
    row = rhs.row;
    seatno = rhs.seatno;
    flightno = rhs.flightno;

    return;
}

passenger::passenger( string line ) {
    // tokenizes string to obtain passenger data
    // seems to work fine, actual code is too long to include
    // and doesn't seem relevant here
}

passenger::passenger() {
    plast.clear();
    pfirst.clear();
    row = 0;
    seatno = '\0';
    flightno = 0;

    return;
}

もちろん、通常のアクセサーやオーバーロードされた挿入演算子なども含まれます。ありがとうございます。

4

1 に答える 1

1

ヘッダーファイルの欠落や質問に示されていない他のコードの問題以外に、コードが移植できない明確な理由がわかりません。いくつかの改善を加えた移植可能なコードの行をいくつか提案できます。

#include <vector>
#include "passenger.h" // assuming class passenger is declared here

class airline {
    std::vector <passenger> persons_; // trailing underscore to distinguish data members
public:
    airline () {};
    explicit airline (int np); // explicit constructor to avoid implicit conversion from int.
~airline () {};
// other functions
} ;

そして .cpp ファイルで:

airline::airline (int np) : persons_(np) {} // persons has np passengers

乗客数用の別のデータ メンバーは必要ありません。から入手できますstd::vector::size()

于 2012-08-21T05:36:41.337 に答える