我正在写一个测试用例来解决我的应用程序中的一个更大的问题。我结束了在codepad上尝试一些代码,发现一些在我的本地机器(带有-Wall的g++ 4.4.1 )上编译的代码不能在codepad (g++ 4.1.2)上编译,即使我的本地机器有更新版本的g++。
Codepad称这是对引用错误的引用,我查找了一下,找到了一些关于它的信息。看起来有一个引用的stl容器并不是一个好主意。这是否意味着我需要定义自己的PairPages类?如果是这样的话,为什么要在本地编译呢?到底怎么回事?
代码板链接:http://codepad.org/UAaJI1rl
#include <deque>
#include <utility>
#include <iostream>
using namespace std;
class Page {
public:
Page() : number_(++count) {}
int getNum() const { return number_; }
private:
static int count;
int number_;
};
int Page::count = 0;
class Book {
public:
Book() : currPageIdx_(3) {
int numPages = 5;
while (numPages > 0) {
pages_.push_back(Page());
numPages--; // oops
}
}
pair<const Page&, const Page&> currPages() { return pagesAt(currPageIdx_); }
pair<const Page&, const Page&> pagesAt(int pageNo) { return make_pair(pages_[pageNo - 1], pages_[pageNo]); }
//const Page& currPages() { return pagesAt(currPageIdx_); }
//const Page& pagesAt(int pageNo);
private:
deque<Page> pages_;
int currPageIdx_;
};
int main() {
Book book;
cout << book.pagesAt(3).first.getNum() << endl;
cout << book.currPages().first.getNum() << endl;
}发布于 2009-12-29 18:13:54
引用的vector (或任何STL容器)确实不是一个好主意,当您简单地查看任何STL容器(ISO C++03 23.1lib.container.requirements)的元素类型T的需求时,这一点是显而易见的。它一开始就说“容器是存储其他对象的对象”。我们可以到此为止,因为引用不是C++中的对象(与指针不同;请注意,C++术语中的“对象”并不意味着“类的实例”!)。但是,此外,它要求T为Assignable,其要求引用类型T& -如果T本身是某个引用类型U&,则构造的类型将是U& &,这(对引用的引用)在C++中是非法的。
如果你真的想拥有一个不管理对象生存期的容器,那么你应该使用一个指针容器。如果你更喜欢引用的安全性(例如,缺少指针算法和空值),你可以使用std::tr1::reference_wrapper<T>类,它是可复制构造和可赋值的引用包装器。
发布于 2009-12-29 18:16:25
关于海报的无限循环问题:您的代码无限循环,因为在Book构造函数中计数器numPages永远不会减少,因此while语句永远不会停止,直到内存耗尽。
通过使用for循环通常可以更容易地发现这些类型的错误:
Book() : currPageIdx_(3) {
for(int numPages = 0; numPages < 5; ++numPages) {
pages_.push_back(Page());
}
}https://stackoverflow.com/questions/1973815
复制相似问题