这不是一个设计问题,真的,虽然它可能似乎喜欢它。(好吧,好吧,这是一种设计问题)。什么我不知道是为什么C++ std::fstream 类不采取一个 std::string 在他们的构造或开放的方法。每个人都喜欢码的例子所以:

#include <iostream>
#include <fstream>
#include <string>

int main()
{
    std::string filename = "testfile";      
    std::ifstream fin;

    fin.open(filename.c_str()); // Works just fine.
    fin.close();

    //fin.open(filename); // Error: no such method.
    //fin.close();
}

这让我有时间的工作文件。当C++库将使用 std::string 无论可能吗?

有帮助吗?

解决方案

通过采取一C string C++03 std::fstream 类减少依赖上 std::string 类。C++11,但是, std::fstream 类不允许通过一个 std::string 其构造的参数。

现在,您可能想知道为什么没有一个透明的转换一个 std:string C string,因此一类,预计C串可能仍然需要一个 std::string 就像一个类的希望 std::string 可以采取一C string.

其原因是,这将导致转换周期,而这又可能导致的问题。例如,假设 std::string 将可转换为一个C串这样你就可以使用 std::strings fstreams.还假设,C串转换到 std::strings作是国家在目前的标准。现在,考虑以下几点:

void f(std::string str1, std::string str2);
void f(char* cstr1, char* cstr2);

void g()
{
    char* cstr = "abc";
    std::string str = "def";
    f(cstr, str);  // ERROR:  ambiguous
}

因为你可以将两种方式之间的一个 std::string 和一个C串的呼叫 f() 可以解决的两个 f() 替代品,并因而模糊不清。该方案是打破周转一转换方向明确,这是什么选择了STL做 c_str().

其他提示

有几个地方,C++标准委员会并没有真正优化之间的相互作用的设施标准图书馆。

std::string 及其使用的图书馆是其中之一。

一个其他的例子是 std::swap.许多集装箱有一个交换成员的功能,但没有载的std::交换提供。这同样适用于 std::sort.

我希望所有这些小东西会被固定在即将到来的标准。

也许这是一个安慰:所有fstream是有了一个开放的(string const&,...)下开(char const*,...)在工作草案C++0x标准。(例如见27.8.1.6的basic_ifstream宣言》)

所以当它被最终敲定和实施,这不会得到你了:)

流IO库已经加入到标准C++库之前STL。为了不断向后兼容的,它已决定避免修改IO库时限的加入,甚至如果这意味着一些问题一样,你提高。

@伯纳德:
巨石"被解开." "大家为一人,一人为大家"可以作为剑客,但是它不工作了近,以及为流的设计师。这里有一个例子就是不完全示例性的,它只是说明有多严重,你可以去错误的当设计变成重复设计.例是,不幸的是,采取从一个标准图书馆附近你...~ http://www.gotw.ca/gotw/084.htm

这是无关紧要的,这是真实的。你是什么意思std::string的接口正在大?有什么大的意思是,在这种情况下-很多的方法的电话?我不是开玩笑,我是真的感兴趣。

它具有更多方法,比它真正的需要,及其行为采用整体的偏移而不是迭代的是一位前途未卜(因为它违背该办法的其余部分图书馆作品)。

真正的问题我想是C++图书馆有三个部分;它有老C库,它具有STL,它已串和iostreams.虽然一些努力都是为了弥补不同部分(例如此外的重载于C库,因为C++支持过载;此外迭代要basic_string;另外的法师迭代的适配器),也有很多不一致之处,当你看到的细节。

例如,basic_string包括方法是不必要的重复的标准算法;各找到方法,很可能被安全地删除。另一个例子:选择使用的原始指针,而不是迭代器。

C++上成长起来比较小的机器的怪物我们编写代码,用于今天。回来时,法师是新的许多开发人员真正关心的码尺寸(他们不得不适合他们的整个程序和数据分成几百KB)。因此,许多不想拉在"大"C++串图书馆。许多甚至没有使用法师的图书馆出于同样的原因,代码尺寸。

我们没有成千上万兆字节的RAM扔像我们今天所做的。我们通常没有功能等级链接,所以我们的怜悯的开发图书馆的使用大量的单独的目标文件或其他拉吨的多余的代码。所有这形成的阻挠者阵营造商避免性病::string.

回然后我避免性病::string。"太臃肿","叫malloc往往",等等。愚蠢地采用基于栈的缓冲区弦,然后添加各种繁琐的代码,以确保不超支。

是否有任何类STL,需要一串...我不这样认为(不会发现任何在我的快速搜索)。所以它可能是一些设计上的决定,没有类STL应该依赖于任何其他STL类(即不是直接所需的功能).

我认为,这已被认为有关并且是为了避免依赖;即#包括 <fstream> 不应该强迫一个#包括 <string>.

说实话,这似乎是一个相当重要的问题。一个更好的问题是,为什么是std::string的接口,这样大?

现在你可以解决这个问题很容易:添加 -std=c++11 你的 CFLAGS.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top