请考虑以下代码:
struct s
{
const int id;
s(int _id):
id(_id)
{}
};
// ...
vector<s> v; v.push_back(s(1));
Run Code Online (Sandbox Code Playgroud)
我得到一个编译器错误,'const int id'不能使用默认赋值运算符.
Q1.为什么push_back()需要赋值运算符?
A1.因为目前的c ++标准是这样说的.
Q2.我该怎么办?
A2.我会使用智能指针.
Q3.我提出了一个"解决方案",这似乎相当疯狂:
s& operator =(const s& m)
{
if(this == &m) return *this;
this->~s();
return *new(this) s(m);
}
Run Code Online (Sandbox Code Playgroud)
我应该避免这种情况,为什么(如果是这样)?如果对象在堆栈上,使用placement new是否安全?
我对c ++比较陌生,并且在ifstream方面存在一些问题.我想要做的就是逐字节读取文件,但读取总是在文件中间失败.我的代码:
void read(ifstream&f)
{
unsigned char b;
for (int i=0;;++i)
{
if(!f.good())
{
cout<<endl<<"error at: "<<i;
return;
}
f>>b; // b=f.get(); and f.read(&b, 1); doesnt work either
cout<<b;
/* ... */
}
}
Run Code Online (Sandbox Code Playgroud)
它正确读取前几百个字节,然后跳过文件的其余部分.缓冲有什么问题吗?我做错了什么?
编辑:
我刚刚找到了可能是原因的东西:在文件中我使用CRLF行结尾(2个字节),但是所有上述方法只返回LF,所以在每行的末尾我只增加1,但是有文件中有2个字节.所以我的问题是:如何分别同时获得CR和LF?
据我了解临时代码,以下代码应该可以工作,但事实并非如此.
struct base
{
virtual~base() {}
virtual void virt()const=0;
};
struct derived:public base
{
virtual void virt()const {}
};
const base& foo() {return derived();}
int main()
{
foo().virt();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
对virt()的调用给出了一个"纯虚函数调用"错误.为什么这样,我该怎么办?
有人可以推荐一个简单易用的 PNG库,用于c ++或.NET吗?它需要做的就是:加载大的PNG图像(比如20000x20000),并告诉我每个像素的颜色.
.NET中的位图类无法加载大图像,抛出OutOfMemory异常.
我花了一些时间在google上查看c ++库,但是所有这些都比我需要的要多得多,而且它们的使用对我来说太复杂了.
看看下面的代码:
struct s
{
s& operator+() {return*this;}
};
void foo(s &) {}
s bar() {}
int main()
{
foo(bar()); //comp error
foo(+bar()); //ok
}
Run Code Online (Sandbox Code Playgroud)
我认为main()中的两行应该是等价的,因为编译器优化了运算符+(),对吧?接受一个而不是另一个有什么意义?