标签: initializer

我可以在C++中创建一个匿名的,大括号初始化的聚合吗?

可以创建一个通过构造函数参数初始化的匿名对象,例如在下面的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)

c++ aggregate initializer

5
推荐指数
2
解决办法
558
查看次数

当f:ajax被执行时,总是调用JSF2 preRenderComponent

我有一个由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()

ajax jsf initializer postconstruct jsf-2

5
推荐指数
1
解决办法
9906
查看次数

定义或声明中的成员初始化列表?

我应该在构造函数声明中声明类的成员初始值设定项列表:

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++ constructor initializer

5
推荐指数
1
解决办法
1150
查看次数

在C++中初始化C结构

对于我正在研究的微控制器项目,我正在编写一个共享库.我正在混合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)

c c++ struct initializer

5
推荐指数
0
解决办法
251
查看次数

字段Initilizers(静态或非静态)和构造函数(静态或非静态)首先运行

根据我读到的内容,我不清楚某些事情:

  1. Field Initializers 在构造函数之前运行.
  2. Static field Initializers在调用之前执行static constructor(仍与第1点兼容).
  3. 如果一个类型没有静态构造函数,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.

我不能真正遵循这个逻辑,请向我澄清.

编辑:我期望发生的事情:

  1. 当Foo.X:执行:public static Foo Instance = new Foo();
  2. 在调用打印的构造函数之前("在构造函数中:"+ X),public static int X = 3; 应该执行,但是构造函数首先触发,是不是认为字段完全先运行?我的意思是即使在跳入内部创建新的Foo实例时,也必须先运行字段.
  3. 从最后两点我打算打印3然后打3

.net c# constructor initializer visual-studio

5
推荐指数
1
解决办法
121
查看次数

将不可用的初始化程序委托给可用的初始化程序

编辑

感谢@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)

enums initializer swift

5
推荐指数
1
解决办法
775
查看次数

在UIButton中初始化目标的位置?特别关心IBDesignable

我有一个

@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中的正确方法是什么?

initializer uibutton ios swift

5
推荐指数
1
解决办法
788
查看次数

结构体成员的默认值

(我确定这个问题已经得到回答,我只是不确定用什么词来提问。如果有人能告诉我正确的术语是什么,那就太棒了!)

我正在HashSetC++ 中为数据结构类实现 a ,我有一个关于 C++ 语法的问题。这是我的代码:

struct HashNode
{
    T value;
    HashNode* next = nullptr;
};
Run Code Online (Sandbox Code Playgroud)

这段代码会正确初始化next指向nullptr何时new HashNode被调用的指针吗?如果不是,nextafter的值是new HashNode多少?

c++ initialization initializer c++11

5
推荐指数
1
解决办法
3891
查看次数

在easy init Swift 3中获取类名

我正在尝试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'

有谁知道如何解决这个错误,或以另一种方式实现相同的结果.

core-data initializer nsmanagedobject ios swift

5
推荐指数
1
解决办法
1120
查看次数

高级C问题:请解释C构造*({foo(&bar);&bar;})

最终,这是在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中的括号块的了解,该值将得出最后一个赋值的值,在这种情况下为结构的地址。

但是,所有这些内容的封闭*( )变得很有趣(这让我感到困惑)。

  1. “获取” 到底在做什么
  2. 是否导致函数init_completion()被调用(可能)?
  3. 指向作为获取的对象的结构的指针的结果是什么?
  4. 它可以在什么情况下应用?

我不确定发生了什么,如何构思它以及如何将结果分配给struct completion workin中完成的不确定 …

c gcc struct initializer linux-kernel

5
推荐指数
1
解决办法
136
查看次数