小编Dav*_*ave的帖子

使用const成员分配类

请考虑以下代码:

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.我该怎么办?

  • 我不想放弃const说明符
  • 我想要复制数据

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++ const vector placement-new assignment-operator

10
推荐指数
2
解决办法
6797
查看次数

用ifstream读取字节数

我对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?

c++ file-io

6
推荐指数
2
解决办法
2万
查看次数

c ++ temporary - "纯虚方法"

据我了解临时代码,以下代码应该可以工作,但事实并非如此.

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()的调用给出了一个"纯虚函数调用"错误.为什么这样,我该怎么办?

c++ virtual-functions temporary pure-virtual

6
推荐指数
2
解决办法
718
查看次数

易于使用的PNG lib?

有人可以推荐一个简单易用的 PNG库,用于c ++或.NET吗?它需要做的就是:加载大的PNG图像(比如20000x20000),并告诉我每个像素的颜色.

.NET中的位图类无法加载大图像,抛出OutOfMemory异常.

我花了一些时间在google上查看c ++库,但是所有这些都比我需要的要多得多,而且它们的使用对我来说太复杂了.

.net c++ png

3
推荐指数
2
解决办法
8729
查看次数

c ++ strage解决编译错误的方法

看看下面的代码:

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()中的两行应该是等价的,因为编译器优化了运算符+(),对吧?接受一个而不是另一个有什么意义?

c++ compiler-errors reference operators pass-by-reference

2
推荐指数
1
解决办法
82
查看次数