【问题标题】:C++ Instantiate, inside another class, a class-type variable from a group of classes with same constructorC ++在另一个类中实例化来自具有相同构造函数的一组类的类类型变量
【发布时间】:2016-08-16 13:58:10
【问题描述】:

我在 C++ 方面并不先进。假设我有一组类,从A 到任何(数量会随着时间增长),它们使用相同类型的构造函数。假设它看起来像这样:

class A
{
private:
    double m_x, m_y;
public:
    A(const double &x, double &y, const short &n) { ... };
};

这些类中的每一个都有相同的m_x, m_y 变量,但它们的计算方式不同。现在有另一个类,比如Bla,它需要使用前一组类中的构造函数,如下所示:

class Bla
{
private:
    Class m_class;
public:
    Bla(const double &x, const double &y, const double &z, const short &i)
    {
        switch (i)
        {
        case 1: m_class = A::A(...); break;
        case 2: m_class = B::B(...); break;
        ...
        }
    }
};

构造函数中的switch (i)根据@​​987654327@选择组的构造函数之一。如何使Bla 中的Class m_class 变量与构造函数中的switch (i) 一致?我应该选择什么类型的变量,或者如何选择?

或者,m_class 只需要保存来自组中的一个类的m_x, m_y 变量,以进行进一步处理/计算/等,还有另一种方法吗?我希望我能弄清楚这一点。

【问题讨论】:

  • 听起来你需要一个工厂函数。
  • 而且,首先,一个基本的公共超类持有m_xm_y

标签: c++ class constructor


【解决方案1】:

你可以有一个带有这些公共成员变量的接口类

class I
{
public:
    virtual ~I() = default;
protected:
    double m_x, m_y;
};

然后从中派生您的具体类,每个类都会以不同的方式填充 m_xm_y

class A : public I
{
public:
    A(const double &x, double &y, const short &n) { ... };
};

那么您的 Bla 构造函数本质上充当工厂,并根据您的 i 参数生成特定类型的 I

class Bla
{
private:
    std::unique_ptr<I> m_class;
public:
    Bla(const double &x, const double &y, const double &z, const short &i)
    {
        switch (i)
        {
        case 1: m_class = std::unique_ptr<I>(new A(...)); break;
        case 2: m_class = std::unique_ptr<I>(new B(...)); break;
        ...
        }
    }
};

【讨论】:

  • 感谢您的回答。一个问题,不过。我不知道unique_ptr,我只是读过它。它说我不必为此使用delete,但这是否也意味着我可以在运行时动态使用它而不会让人头疼?清理指针并不是我真正喜欢的...
  • 我现在看到了包含析构函数的编辑。我将此标记为答案。
  • 是的,没错,unique_ptr 允许您仍然获得多态行为(即使用接口),但您不必手动 delete 任何东西
【解决方案2】:

您可以从一个通用类派生这些类。例如:

class Test {
    double Val1, Val2;
public:
    Test() {}
};

class A: public Test { 
    /* constructor and class-specific variables only,
       don't declare Val1 & Val2 here */
}

然后,将m_class 设为指向Test 的指针,并用new 实例化switch 中的类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多