如何在新调用中使用更多参数
How can I use more parameters in a new call?
对不起,如果"新调用"不是C - 术语。如果不是,请告诉我正确的术语。我是C 开始的C程序员。我有struct A
,我想使用new
操作员中的参数仪对其进行初始化。这样:
A* a = new A(foo, baa);
所以,我尝试使用它定义函数: void* A::operator new(T a, T B) { ... }
但是我得到了一个编译器 - eRror:
error: 'operator new' takes type size_t ('unsigned int') as first parameter
另外,不确定它是否相关,但是已经定义了size_t
类型的过载参数的功能:
void* A::operator new(size_t size) { ... }
您无需为此超载operator new
。您只想要一个构造函数:
class A
{
public:
A(FooType foo, BaaType baa);
};
A::A(FooType foo, BaaType baa)
{
// initialize object here
}
然后您可以写(假设您已经获得了FooType
类型的foo
等):
A *a = new A(foo, baa);
在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
关键字的原因是防止在自动转换中使用给定的构造函数。在pre-c 11次中,它对多拨构构建体没有影响。但是在C 11中,当您使用Brace Intialization时会产生影响。
您需要区分new
操作员和构造函数:new
操作员无所作为,而不是malloc()
,它们分配了一个内存的一巴掌。然后,构造函数初始化了该记忆的一巴掌,以使其成为类型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
数据成员的构造函数(:
和{
之间的零件。
- 当对话框被接受时,如何用参数调用槽
- 使用用户定义的参数调用future/async并调用类方法
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 不允许运算符 const 参数调用 const 成员函数
- 为变量模板的每个参数调用模板函数
- 如何在窗口中使用注入的 dll 中的参数调用函数
- 按引用调用与按指针参数调用的差异 前递增和后递增
- 为什么使用不匹配的参数调用重载函数仍然有效
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 基于枚举参数调用专用模板方法
- C++ 如何根据作为输入传递的参数调用一个构造函数或另一个构造函数?
- 如何使用类模板参数来更改参数调用和函数签名?
- lambda 函数使用其参数作为模板参数调用模板函数
- Android:使用 c++ 中的 byte[] 参数调用 java 方法
- 使用不同的模板参数调用模板类的对象
- C++编译时检查是否可以用某种类型的参数调用重载函数
- 是否可以基于类模板的参数调用类方法和全局方法
- 使用单独的参数调用"boost::process::system()"时,获取"execv
- C++大括号初始值设定项作为参数调用不同的构造函数,然后预期