可以创建一个通过构造函数参数初始化的匿名对象,例如在下面的return语句中.
struct S {
S(int i_, int j_) : i(i_), j(j_) { }
int i, j;
};
S f()
{
return S(52, 100);
}
int main()
{
cout << f().i << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,是否可以类似地创建一个使用大括号初始化程序初始化的匿名聚合?例如,可以将f()的主体折叠到下面,直到单个return语句而没有"s"吗?
struct S {
int i, j;
};
S f()
{
S s = { 52, 100 };
return s;
}
int main()
{
cout << f().i << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有一个由NewsBean.java支持的JSF页面,它具有<f:event type="preRenderComponent" listener="#{newsBean.init}" />
bean初始化程序.
有一个在发送它有评论页面底部的按钮:
<f:ajax event="click" execute="@form" render="@form" listener="#{newsBean.sendComment}" />
并通过包围<h:form>
.单击按钮时,NewsBean.init()
始终会调用该按钮.
我的bean范围是视图.这是一个有效的行为(总是调用init())?我怎样才能防止总是打电话init()
?
我应该在构造函数声明中声明类的成员初始值设定项列表:
class A
{
public:
A(int data) : theData(data);
};
Run Code Online (Sandbox Code Playgroud)
或者在构造函数定义中:
A::A(int data) : theData(data)
{
// code...
};
Run Code Online (Sandbox Code Playgroud)
或者没关系?如果你以某种方式做到了,为什么?
对于我正在研究的微控制器项目,我正在编写一个共享库.我正在混合C和C++,主要是因为需要在低级部分完成所有指针算术,因为我的代码很容易映射到C库.但是,在不同的微控制器上,我想将C++用于硬件部分.作为HAL,我使用函数指针的结构来给出实现.
现在,指针在公共文件中声明,如下所示:
extern HALPointer * _hal_ptr;
Run Code Online (Sandbox Code Playgroud)
现在,在我的C文件中,我只是说
HALPointer _hal_ptr = (HALPointer) {
.init = &Native_init,
.destroy = &Native_destroy,
.write = &Native_write,
...
}
Run Code Online (Sandbox Code Playgroud)
但是,在我的C++文件中,我无法使用命名的初始化列表.我正在使用G ++支持c ++ 98,gnu ++ 98,c ++ 0x和gnu ++ 0x.有没有办法做到这一点?
编辑:这是在C++文件中完成的,使用C调用约定等.
extern "C" {
}
Run Code Online (Sandbox Code Playgroud)
也不可能使用函数来执行此操作.此外,元素的顺序可能会改变,因此需要命名成员初始化.
编辑2:在C++结构初始化中,提出了一些解决方案,遗憾的是,这些解决方案不起作用或不合适.由于元素的顺序必然会发生变化(并且可能会添加项目等),因此非命名版本不是一个选项.最后一个解决方案无法编译.另一种解决方案至少可以说是可怕的.
编辑3:坚持可怕的解决方案:
extern "C" {
HALPointer _hal_ptr = (_hal_tr = HALPointer(),
_hal_ptr.init = &PRU_init,
_hal_ptr.destroy = &PRU_destroy,
....
_hal_ptr);
}
Run Code Online (Sandbox Code Playgroud) 根据我读到的内容,我不清楚某些事情:
Field Initializers
在构造函数之前运行.Static
field Initializers
在调用之前执行static
constructor
(仍与第1点兼容).field Initializers
将在使用的类型之前执行(据我所知:没有实例化,而是被使用)这个例子解释了:
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Foo.X);
Console.ReadLine();
}
}
class Foo
{
public static Foo Instance = new Foo();
public static int X = 3;
Foo()
{
Console.WriteLine("In constructor: " + X);
}
}
Run Code Online (Sandbox Code Playgroud)
此代码打印0,然后3!怎么可能呢?当我们通过Foo.X使用Foo时,会在构造函数之前调用两个第一个初始化器(到目前为止还可以),
public static Foo Instance = new Foo();
Run Code Online (Sandbox Code Playgroud)
执行它应该在调用构造函数(第1点)之前运行它自己的2个初始化程序,而它首先运行构造函数并打印X作为默认值为0.
我不能真正遵循这个逻辑,请向我澄清.
编辑:我期望发生的事情:
编辑
感谢@Airspeed Velocity找到了一个简单的解决方案,因为这是从JSON解析的.允许初始化程序采用AnyObject?
并默认为Unknown
(或Invalid
):
init(value: AnyObject?) {
if let value = value as? Int
,let result = Result(rawValue: value) {
self = result
} else {
self = .Unknown
}
}
Run Code Online (Sandbox Code Playgroud)
//
原版的
我用一个Unknown
案例实现了一个枚举:
enum Result: Int {
case Success
case Failure
case Foo
case Bar
case FooBar
case FooFoo
...
case Unknown = -1
}
Run Code Online (Sandbox Code Playgroud)
我想创建另一个初始化程序,它接受枚举无法识别的情况Int
并返回Unknown
:
init(value: Int) {
self.init(rawValue: value)
if self == nil { // Complication …
Run Code Online (Sandbox Code Playgroud) 我有一个
@IBDesignable
class Fancy:UIButton
Run Code Online (Sandbox Code Playgroud)
我想要
addTarget(self, action:#selector(blah),
forControlEvents: UIControlEvents.TouchUpInside)
Run Code Online (Sandbox Code Playgroud)
那么UIButton应该在哪里完成?
addTarget
?1 - 我见过layoutSubviews
建议 - 是吗?
注意 - 实验表明,问题layoutSubviews
在于,当事物四处移动时,它可以经常被调用."addTarget"不止一次是一个坏主意.
2 - didMoveToSuperview
是另一个建议.
3 - Inits中的某个(某个)?
注意 - 如果你在Init中进行实验,那么实验会显示一个引人入胜的问题.在Init期间,IBInspectable变量尚未实际设置!(例如,我根据IBInspectable设置的控件的"样式"进行分支;它不能用作@IBInspectable:在运行时不起作用!)
4 - 其他地方???
我尝试在Init中做到这一点,并且效果很好.但它打破了编辑工作中的可设计性.
通过捶打,我想出了这个(出于某种原因,两者都必须包括在内?)
@IBDesignable
class DotButton:UIButton
{
@IBInspectable var mainColor ... etc.
required init?(coder decoder: NSCoder)
{
super.init(coder: decoder)
addTarget(self, action:#selector(blah),
forControlEvents: UIControlEvents.TouchUpInside)
}
override init(frame:CGRect)
{
super.init(frame:frame)
}
Run Code Online (Sandbox Code Playgroud)
我不知道为什么会这样,我不明白为什么会有两个不同的init例程.
包含addTarget
在UIButton中的正确方法是什么?
(我确定这个问题已经得到回答,我只是不确定用什么词来提问。如果有人能告诉我正确的术语是什么,那就太棒了!)
我正在HashSet
C++ 中为数据结构类实现 a ,我有一个关于 C++ 语法的问题。这是我的代码:
struct HashNode
{
T value;
HashNode* next = nullptr;
};
Run Code Online (Sandbox Code Playgroud)
这段代码会正确初始化next
指向nullptr
何时new HashNode
被调用的指针吗?如果不是,next
after的值是new HashNode
多少?
我正在尝试convenience init(context moc: NSManagedObjectContext)
在iOS 10中实现我自己的版本,NSManagedObject上的新便捷初始化器.原因是我需要使它与iOS 9兼容.
我想出来了:
convenience init(managedObjectContext moc: NSManagedObjectContext) {
let name = "\(self)".components(separatedBy: ".").first ?? ""
guard let entityDescription = NSEntityDescription.entity(forEntityName: name, in: moc) else {
fatalError("Unable to create entity description with \(name)")
}
self.init(entity: entityDescription, insertInto: moc)
}
Run Code Online (Sandbox Code Playgroud)
但由于这个错误它不起作用......
在self.init电话之前使用'self'
有谁知道如何解决这个错误,或以另一种方式实现相同的结果.
最终,这是在Linux内核源代码的complete.h中学习代码时出现的一个C问题,在那里我看到了以前从未在C中使用过的C技术。尽管对它的操作有一个模糊的感觉,但我想通过精确的描述来微调我的理解,而且我不确定如何在不费劲的情况下用Google搜索答案。
来自Linux内核的complete.h的相关代码行:
struct completion {
unsigned int done;
wait_queue_head_t wait;
};
#define COMPLETION_INITIALIZER_ONSTACK(work) \
(*({ init_completion(&work); &work; }))
#define DECLARE_COMPLETION_ONSTACK(work) \
struct completion work = COMPLETION_INITIALIZER_ONSTACK(work)
static inline void init_completion(struct completion *x)
{
x->done = 0;
init_waitqueue_head(&x->wait);
}
Run Code Online (Sandbox Code Playgroud)
并在使用中:
int myFunc()
{
DECLARE_COMPLETION_ON_STACK(comp);
.
.
.
wait_for_completion(&comp);
}
Run Code Online (Sandbox Code Playgroud)
具体来说,我想了解的代码COMPLETION_INITIALIZER_ON_STACK
。
我相信两个语句的括号主体{ init_completion(&work); &work; }
仅产生一个值&work
(NOP语句),根据我对C中的括号块的了解,该值将得出最后一个赋值的值,在这种情况下为结构的地址。
但是,所有这些内容的封闭*( )
变得很有趣(这让我感到困惑)。
init_completion()
被调用(可能)?我不确定发生了什么,如何构思它以及如何将结果分配给struct completion work
in中完成的不确定 …