0

我已经定义了一个这样的类:

 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() {}
 };

但是我不想要第二个实现。我要第一个。我该如何解决?

4

5 回答 5

1

您可以添加默认构造函数

CircularBuffer()
{
    // set a and b to default values
}
于 2013-04-10T10:06:10.510 回答
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) {}
};
于 2013-04-10T10:05:47.770 回答
0

它迫使我这样做:

...
foo()
  : cb( CircularBuffer(10, 2) )
{}
...

但是我不想要第二个实现。我要第一个。我该如何解决?

它不会强迫你这样做,而是强迫你这样做:

: cb(10, 2)

这就是你在 C++ 中初始化的方式。打开之后的一切{都是赋值,而不是初始化。

“修复”是使用初始化而不是赋值进行初始化。没有太多的爱或恨,这是 C++。

于 2013-04-10T10:10:04.910 回答
0

只需定义cb为指针

#include "circular.h"
 class foo {
    CircularBuffer * cb;
    foo() {}   //ERROR LINE
    void initialize() {
       cb = new CircularBuffer(10, 2);
    }
 };

别忘了到delete cb;某个地方不泄露你的记忆

于 2013-04-10T10:10:29.413 回答
-1

它给你一个错误,因为 cb 不是一个指针,你正在使用“new”。

但是顺便说一句......构造函数初始化更有效:D

于 2013-04-10T10:06:22.060 回答