我编写的一些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()
获得它。