【问题标题】:How to initialize member variables before inherited classes如何在继承类之前初始化成员变量
【发布时间】:2021-08-31 09:03:52
【问题描述】:

我正在尝试创建一个需要首先初始化成员变量的类。我知道为什么会这样,但是有没有办法解决这个问题?

当前打印顺序: 第二 首先

想要的打印顺序: 第一的 第二个

#include <iostream>

struct A {
    A() {
        std::cout << "first" << '\n';
    }
};

struct B {
    B() {
        std::cout << "second" << '\n';
    }
};

struct C : public B {

    C() : a(), B() {

    }

    A a;

};

int main() {

    C c;

    return 0;
} 

【问题讨论】:

  • 简短回答是否定的。也许如果您解释为什么需要它,我们可以告诉您该怎么做。

标签: c++ class


【解决方案1】:

B 之前,将需要首先初始化的成员粘贴到结构中并从该结构中私有继承。

struct A {
    A() { std::cout << "first" << '\n'; }
};

struct B {
    B() { std::cout << "second" << '\n'; }
};

struct Members { A a; };

struct C : private Members, public B {
    C() : Members(), B() {}
};

int main() {
    C c;
} 

这样做的缺点是无法避免将“成员结构”暴露给外界,但这在实践中应该不是问题。

【讨论】:

  • 谢谢!我认为这是迄今为止我的案例的最佳解决方案。
【解决方案2】:

在 C++ 中,基类将在派生类的任何成员变量之前初始化。

根据您提供的信息,最好的办法是更喜欢组合而不是继承:

struct A {
    A() {
        std::cout << "first" << '\n';
    }
};

struct B {
    B() {
        std::cout << "second" << '\n';
    }
};

struct C {
    A a;
    B b;
};

这将展示desired behavior

【讨论】:

    【解决方案3】:

    A 设为C 所需的参考:

    #include <iostream>
    
    struct A {
        A() {
            std::cout << "first" << '\n';
        }
    };
    
    struct B {
        B() {
            std::cout << "second" << '\n';
        }
    };
    
    struct C : public B {
        C(const A& a) : _A(a), B() {}
        const A& _A;
    };
    
    int main() {
        A a;
        C c(a);
        return 0;
    }
    

    【讨论】:

    • 为什么不C(A a = {}) : B{}, _A{std::move(a)} {}?存储副本时通常最好按值传递。
    • @RoQuOTriX 这没有回答问题,因为显式创建了 A A a 类型的对象;与所描述的问题没有任何共同点。
    • 以下划线开头后跟大写字母 (_A) 的名称和包含两个连续下划线的名称保留供实现使用。不要在代码中定义它们。
    • @TobySpeight 没有复制,成员是参考
    • 从技术上讲,成员 (_A) 仍然在 B 之后初始化,尽管 AB 之前构造。这是否适用于这个问题取决于他们为什么想要这种初始化顺序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2018-01-21
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    相关资源
    最近更新 更多