在构造函数或init函数中创建对象

时间:2013-04-10 10:03:05

标签: c++ class

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

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

但是我不希望第二次实施。我想要第一个。我该如何解决这个问题?

5 个答案:

答案 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