XCode、命名空间、C++和代码可移植性



我编写的一些C++源代码使用Visual Studio 2010在Windows 7上编译并运行良好。但当我在Mac OS X 10.8 Mountain Lion上使用XCode 4.4.1尝试它时,它无法编译。我能够按照下面的详细说明修复它,但我很想知道我一开始做错了什么,以及为什么需要修复。

具体来说,考虑以下类声明:

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

接受int参数的airline的构造函数是:

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

在Windows计算机上,它编译并运行时没有出现任何问题。然而,XCode痛苦地抱怨说,我没有一个可行的"乘客"构造函数。我有一个乘客的默认构造函数,所以这不是问题所在。根据我之前在这个网站上的一个问题,我也尝试过使用persons.erase而不是调整大小,但没有成功。

最终,我能够通过使用persons.vector::resize (npassengers);而不是persons.resize (npassengers);在Mac上编译代码。我想知道为什么有必要在Mac端这样做,为什么它在Windows端没有问题。

一个相关的问题是,在代码的顶部使用using namespace std;是否是一种糟糕的做法,而我是否应该指定std::cout等。?如果是,为什么?

请容忍我缺乏知识,谢谢你的帮助!

编辑:Sean建议我为乘客显示我的代码,所以这里是:

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 = '';
    flightno = 0;
    return;
}

当然还有常见的访问器和重载插入运算符等。谢谢!

除了缺少头文件或问题中未显示的其他代码存在问题外,我看不出代码不可移植的任何明显原因。我可以建议使用一些改进的可移植代码:

#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()获得它。

相关内容

  • 没有找到相关文章

最新更新