繁体   English   中英

初始化列表-可以与同一类的其他成员初始化成员吗?

[英]Initialization Lists - Can I initialize members with other members of the same class?

出于RAII的考虑,我希望将类成员保留为值对象,但是我也想将指向其他对象的指针传递到其构造函数中,以确保立即对其进行初始化。

我正在使用构造函数初始化列表对其进行初始化,但是我不确定是否可以使用指向其他类成员的指针来初始化类成员。

以下代码可以使用Apple LLVM 5.1编译器在XCode中按我的预期进行编译和运行,但是我可以对所有编译器使用并信任此定义的行为吗? 而且,这是一般的好习惯还是应该避免的事情? 除了init()函数之外,还有其他方法可以实现此目的吗?

class Foo {
public:
    int value;
    Foo() {}
    void woot() {
        std::cout << "A Foo says WOOT my value is: " << value << std::endl;
    }
};

class Bar {
public:
    Foo* foo;
    int value;
    Bar( Foo* f ) : foo(f) {
        foo->value = 66;
        foo->woot();
    }
    void woot() {
        std::cout << "A Bar says WOOT my value is:  " << value << std::endl;
    }
};

class Boo {
public:
    Foo* foo;
    Bar* bar;
    int value;
    // Passing members into constructors of other members:
    Boo( Foo* f, Bar* b ) : foo(f), bar(b) {
        foo->value = 77;
        foo->woot();
        bar->value = 88;
        bar->woot();
    }
};

class Yaa {
public:
    Foo foo;
    Bar bar;
    Boo boo;
    Yaa() : bar(&foo), boo(&foo, &bar) {
        woot();
    }
    void woot() {
        std::cout << "A Yaa says WOOT, my children say woot:" << std::endl;
        foo.woot();
        bar.woot();
    }
};

void testInitialisation() {
    Yaa f;
}

// ...

testInitialisation();

// Output:
// A Foo says WOOT my value is: 66
// A Foo says WOOT my value is: 77
// A Bar says WOOT my value is:  88
// A Yaa says WOOT, my children say woot:
// A Foo says WOOT my value is: 77
// A Bar says WOOT my value is:  88

编辑/注意:接受@Wes Hardaker的回答后,我听取了他的建议,并对初始化顺序进行了更多阅读。 我相信我最初的困惑是在阅读《 The C ++ Primer》(Lippman,Lajoie和Moo)中的“最佳实践”注释后发生的:

...如果可能,请避免使用成员初始化其他成员。

后来,我想到这个想法是错误的,但是再次阅读本章后,我意识到这是完全合法的,尽管应谨慎使用。 这本书实际上是在警告使用成员初始化其他成员时的潜在危险。 初始化的顺序取决于在类中声明成员的顺序,而不是由它们在初始化列表中的顺序决定 这意味着,如果您将订单向后退,则可以将未定义的成员传递给另一个成员。

因此,如果您谨慎的话就可以了,但是我想它稍后可能会再次咬住您(或其他使用您代码的人)。

是的,这是合法的,并且已在许多地方使用。 如果您查看C ++参考文本,将会发现它涉及初始化顺序,在此您可以放心自己是真的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM