如何在新通话中使用更多参数?

时间:2014-01-20 21:40:02

标签: c++ constructor operator-overloading

很抱歉,如果“新呼叫”不是C ++术语。如果不是,请告诉我什么是正确的术语。我是一个以C ++开头的C程序员。我有struct A我希望使用new运算符中的参数表来初始化它。像这样:

A* a = new A(foo, baa);

所以,我尝试使用它来定义函数:void* A::operator new(T a, T B) { ... }

但是我得到了一个编译错误:

error: 'operator new' takes type size_t ('unsigned int') as first parameter

另外,不确定它是否相关,但已经定义了size_t类型的重载参数的函数,如下所示:

void* A::operator new(size_t size) { ... }

3 个答案:

答案 0 :(得分:5)

您无需为此重载operator new。你只想要一个构造函数:

class A
{
    public:
        A(FooType foo, BaaType baa);
};

A::A(FooType foo, BaaType baa)
{
    // initialize object here
}

然后你可以写(假设你已经获得foo类型的变量FooType,等等):

A *a = new A(foo, baa);

答案 1 :(得分:4)

在C ++中完成的方式是使用A的非默认构造函数。

struct A {
  int a;
  int b;
  explicit A(int a_, int b_) : a(a_), b(b_) {}
};

...
A * a = new A(1, 2);
assert(a->a == 1);
assert(a->b == 2);

冒号(:)后面的表达式是构造函数的初始化列表 - 它们在构造期间执行成员的初始化。它们通常比更多C风格的变体更有效:

A::A(int a_, int b_) { a = a_; b = b_; }

在惯用的C ++中,您总是希望尽可能使用初始化列表。你也不想使用裸指针,所以最好写一下:

std::shared_ptr<A> a(new A(1, 2));
// or
std::unique_ptr<A> a(new A(1, 2));

shared_ptr适用于多个实体可能需要保存实例的情况,并且没有明确的范围应该存在。 unique_ptr适用于存在对象应存在的明确范围的情况。当unique_ptr超出范围时delete ashared_ptr。当最后shared_ptr引用给定对象超出范围时,explicit将执行删除。

使用{{1}}关键字的原因是为了防止在自动转换中使用给定的构造函数。在预C ++ 11次中,它对多参数构造函数没有影响。但是在C ++ 11中,它在you use brace intialization时有效。

答案 2 :(得分:3)

您需要区分new运算符和构造函数:new运算符不会多于或少于malloc(),它们会分配一堆内存。然后,构造函数初始化该内存slap,使其成为A类型的有效对象。

您的困惑源于new关键字同时执行,分配和构造的事实。这条线

A* foo = new A(...);

首先调用new运算符来获取内存,然后调用相应的构造函数,传递给定的参数,以构造对象。

所以,正如其他人已经指出的那样,你需要添加一个带有所需参数的构造函数,而不是new运算符:

class A {
public:
    A(int arg1, int arg2);
    int member1, member2;
};

A::A(int arg1, int arg2) : member1(arg1), member2(arg2) {
    //Do additional stuff that cannot be achieved by calling the constructors of the members alone.
}

请注意,在此代码中,您在初始值设定项列表中显式调用A的数据成员的构造函数(:{之间的部分。