我已经定义了这样一个类:
class CircularBuffer {
private:
struct entry {
uint64_t key;
int nextPtr;
int prevPtr;
int delta;
};
int head, tail, limit, degree;
entry *en;
public:
CircularBuffer(int a, int b)
{
limit = a;
head = 0;
tail = limit -1;
degree = b;
en = new entry[ limit ];
for (int i=0; i<limit; i++) {
en[i].key = 0;
en[i].delta = 0;
en[i].nextPtr = 0;
en[i].prevPtr = 0;
}
};
~CircularBuffer() { delete [] en; }
};
在另一个文件中,我已经包含了这个类(头文件)
#include "circular.h"
class foo {
CircularBuffer cb;
foo() {} //ERROR LINE
void initialize() {
cb = new CircularBuffer(10, 2);
}
};
然而,这有错误说:
error: no matching function for call to ‘CircularBuffer::CircularBuffer()’
note: candidates are: CircularBuffer::CircularBuffer(int, int)
note: CircularBuffer::CircularBuffer(const CircularBuffer&)
它迫使我这样做:
#include "circular.h"
class foo {
CircularBuffer cb;
foo()
: cb( CircularBuffer(10, 2) )
{}
void initialize() {}
};
但是我不希望第二次实施。我想要第一个。我该如何解决这个问题?
答案 0 :(得分:1)
您可以添加默认构造函数
CircularBuffer()
{
// set a and b to default values
}
答案 1 :(得分:0)
这应该是可能的
#include "circular.h"
class foo {
CircularBuffer cb;
foo() {}
void initialize() {
cb = CircularBuffer(10, 2);
}
};
您的版本的问题在于您使用new
,它返回一个指针,但成员变量cb
不是指针。
然而,最好的方法是
#include "circular.h"
class foo {
CircularBuffer cb;
foo() : cb(10, 2) {}
};
或者,如果要将参数传递给构造函数
#include "circular.h"
class foo {
CircularBuffer cb;
foo(int a, int b) : cb(a, b) {}
};
答案 2 :(得分:0)
它迫使我这样做:
... foo() : cb( CircularBuffer(10, 2) ) {} ...
但是我不希望第二次实施。我想要第一个。我该如何解决这个问题?
它不会强迫你这样做,而是强迫于此:
: cb(10, 2)
这就是你在C ++中初始化的方式。开场{
之后的所有内容都是分配,而不是初始化。
“修复”是使用初始化而不是分配进行初始化。没有太多爱或恨,这是C ++。
答案 3 :(得分:0)
只需将cb
定义为指针
#include "circular.h"
class foo {
CircularBuffer * cb;
foo() {} //ERROR LINE
void initialize() {
cb = new CircularBuffer(10, 2);
}
};
不要忘记delete cb;
某处不要泄露你的记忆
答案 4 :(得分:-1)
它会给你一个错误,因为cb不是指针而你使用的是“new”。
但BTW ...构造函数初始化更有效:D