实例化后可以构造吗?避免使用空构造函数

问题描述 投票:0回答:2

我有一个类,该类的成员属性由在其他地方定义的对象组成。在下面的代码中,A包含一个公共属性var,它是一个B

class B {
    public:
    int x, y;
    std::vector<int> z;
        B(int a, int b, std::vector<int> c) {
            x = a; y = b; z = c;
        }
};

class A {
    public:
        B var;
        A(int i, int j) {
            std::vector<int> someVector;
            B(i, j, someVector);
        }
};

int main() {
    A foo(5, 3);
    return 0;
}

[(显然)不会编译,因为在实例化var时实例化了A,为时已晚,无法构建它。

我可以做类似的事情的最好方法是修改一些代码:

class B {
    public:
    int x, y;
    std::vector<int> z;
        B() {}
        void setAttributes(int a, int b, std::vector<int> c) {
            x = a; y = b; z = c;
        }
};

class A {
    public:
        B var;
        A(int i, int j) {
            std::vector<int> someVector;
            B.setAttributes(i, j, someVector);
        }
};

这确实可以编译,因为属性是在实例化之后设置的。

但是有一种方法可以使您更接近第一个代码段?

c++ class oop instantiation
2个回答
3
投票
A(int i, int j) : var(i, j, {}) {}

而且,在您的代码中B(i, j, someVector);不会not初始化成员变量var,而B.setAttributes(i, j, someVector);根本不会编译。


1
投票

如果无法定义有用的默认构造函数,并且不想进行丑陋的两步初始化,那么我想就没有办法绕着指向B的指针了。

#include <memory>

class B {
    public:
        int x, y;
        std::vector<int> z;

        B(int a, int b, std::vector<int> c) {
            x = a; y = b; z = c;
        }
};

class A {
    public:
        std::unique_ptr<B> var;
        A() {
            std::vector<int> someVector;
            var = std::make_unique<B>(5, 2, someVector);
        }
};

int main() {
    A foo();
    return 0;
}

应该做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.