XCode、命名空间、C++ 和代码可移植性
Posted
技术标签:
【中文标题】XCode、命名空间、C++ 和代码可移植性【英文标题】:XCode, namespaces, C++, and code portability 【发布时间】:2012-08-21 04:24:56 【问题描述】:我编写的一些 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
;
airline
采用 int 参数的构造函数是:
airline::airline (int np)
npassengers = np;
persons.resize (npassengers);
return;
在 Windows 机器上,它编译并运行没有问题。然而,XCode 痛苦地抱怨说我没有一个可行的“乘客”构造函数。我有一个乘客的默认构造函数,所以这不是问题。根据我在earlier question on this site 中找到的内容,我还尝试使用 people.erase 而不是调整大小,但没有成功。
最终我能够通过使用persons.vector::resize (npassengers);
而不是persons.resize (npassengers);
在Mac 上编译代码。我想知道为什么有必要在 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;
当然还有常用的访问器和重载的插入操作符等。谢谢!
【问题讨论】:
您没有为乘客提供代码,这可能会影响事情。另外,你为什么要存储npassengers? Persons.size() 给了你完全相同的东西,你只是通过复制一个已经在向量中的成员变量来浪费空间和时间。 向量一开始是空的,npassengers 决定了其中存储了多少乘客。乘客人数因一家航空公司而异。我将进行编辑以显示一些乘客代码。 使用using namespace std
是不好的做法,特别是在标题中。它只是使您很可能会遇到名称冲突,并且这些名称冲突可以通过包含另一个 C++ 标准库头文件来弹出。我会说它使您免于打字的几个字符不值得。见here。有人会说可以在cpp
文件中使用,我绝对不会同意。
@SeanMiddleditch:我同意,但真正的问题不在于空间和时间,而在于我们拥有可能彼此不同步的重复信息。
passengers
中不需要复制构造函数。在这种情况下,编译器合成的就可以了。也不需要在默认构造函数中对字符串数据成员调用clear()
,你也可以使用初始化列表而不是在构造函数体中赋值。
【参考方案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()
获得它。
【讨论】:
谢谢@juanchopanza。修复它的是在 .cpp 文件中明确包含<vector>
,而不仅仅是在不同的头文件中。我仍然对为什么有必要这样做感到困惑;但如果<vector>
未明确包含在.cpp 文件中,可能还会调用另一个resize
函数。你的其他建议也很有帮助,特别是关于如何为航空公司编写构造函数以摆脱npassengers
以上是关于XCode、命名空间、C++ 和代码可移植性的主要内容,如果未能解决你的问题,请参考以下文章
在 libc++ 的内联命名空间中前向声明类的可移植方式是啥?