很抱歉,如果“新呼叫”不是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) { ... }
答案 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 a
将shared_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
的数据成员的构造函数(:
和{
之间的部分。