构造函数不存在

jds*_*oso -3 c++

我试图实现循环缓冲区.所以现在我正在测试一些代码.

raw_buffer.h

#include <algorithm> // for std::min

#ifndef RAWBUFFER_H
#define RAWBUFFER_H

class CircularBuffer
{
public:
    CircularBuffer(size_t capacity);
    ~CircularBuffer();

    size_t size() const { return size_; }
    size_t capacity() const { return capacity_; }
    // Return number of bytes written.
    size_t write(const char *data, size_t bytes);
    // Return number of bytes read.
    size_t read(char *data, size_t bytes);

private:
    size_t beg_index_, end_index_, size_, capacity_;
    char *data_;
};

extern CircularBuffer MyCircularBuffer;

#endif
Run Code Online (Sandbox Code Playgroud)

main_raw.cpp

#include "raw_buffer.h"
#include <iostream>
#include <string>   

using namespace std;

    int main() {
        const char *data_test1 = "AAAA";
        const char *data_test2 = "BBBB";
        const char *data_test3 = "CCCC";

        CircularBuffer Buffer;//<---error

        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

该行CircularBuffer Buffer;给出了错误:"类"CircularBuffer"没有默认构造函数.

Cor*_*mer 5

定义此参数化构造函数时,禁用了编译器生成的默认构造函数

CircularBuffer(size_t capacity);
Run Code Online (Sandbox Code Playgroud)

您可以添加以下内容以获取默认构造函数(请注意,从defaultC++ 11开始,关键字是新的)

CircularBuffer() = default;
Run Code Online (Sandbox Code Playgroud)

虽然您应该确保您的类在有效状态下实例化.如果默认初始化值不适合该帐单,则应手动定义默认构造函数以将成员变量初始化为有效状态.

如果您打算调用参数化构造函数,则需要传递您声明的参数.例如

CircularBuffer buffer{10};   // constructed with a capacity of 10
Run Code Online (Sandbox Code Playgroud)

  • 默认的默认ctor不太可能是正确的解决方案.你会留下`capacity_`未初始化......你确定这是一个好建议吗? (4认同)