【问题标题】:C++ Different constructors use different objectsC++不同的构造函数使用不同的对象
【发布时间】:2018-09-15 14:09:10
【问题描述】:

我正在开发一个具有两个构造函数的类,它们将使用不同的对象。如果我不带参数实例化 foo,我想使用对象 bar,如果我通过 foo(val) 实例化,我想使用对象 baz。

我很困惑我应该如何实施解决方案。继承似乎不太合乎逻辑,因为 bar 和 baz 的函数和变量存在差异。

下面我介绍一下我的想法,基本上我是根据被调用的构造函数设置一个变量。然后在我的 printWrapper 上,我正在比较这个变量以了解我是调用 bar print 还是 baz print。错误之一是由于 bar 和 baz 只有带参数的构造函数。另外我想要的是当我使用/不使用参数实例化 foo 时,我不希望创建对象 bar/baz。你会怎么做?

头文件 foo.h

    class foo {

    public:
           foo();
           foo(int val)

    private:
           bool object_bar;
           void printWrapper();
           bar b; // instance used on constructor foo()
           baz c; // instance used on constructor foo(val)
    }

标题栏.h

    class bar {

    public:
           bar(int val)

    private:
           bool test1;
           int test2;
           void print();
    }

头文件 baz.h

    class baz {

    public:
           baz(int val)

    private:
           bool test1;
           int test2;
           int test3;
           void print();
    }

源 foo.cpp

    foo::foo() : b(5) {
           this->object_bar = true;
    }

    foo::foo(int val) : c(val) {
           this->object_bar = false;
    }

    foo::printWrapper() {
           if (true == this->object_bar)
              b.print();
           else
              c.print();
    }

【问题讨论】:

  • 为什么foo不能是基类,baz_like_foobar_like_foo不能是foo的子类? printWrapper in foo 然后变成了一个纯虚函数。
  • this->object_b = true; 应该是 object_bar 吗?
  • 假设 bar 和 baz 是两种不同的通信协议,所以我在另一个类上使用它们。 foo 类可以使用这两种协议进行通信。
  • Class C 你是说class baz 吗?同样在 c++ 中,关键字 class 以小写字母开头
  • 也许你想要的是std::variant<bar, baz>? (对于您的foo::printWrapper(),请查看std::visit()。)

标签: c++ oop constructor


【解决方案1】:

您可以使用指向基础抽象类的指针作为类 Foo 的私有成员。

然后让类 Bar 和 Baz 继承自这个基类。

然后在你的班级 foo :

/* declaration of the base class in foo.h */
class Base;

class Foo 
{
   /* ... */
   private:
        Base *m_base;
 };

在 foo.cpp 中:

#include "base.h"
#include "bar.h"
#include "baz.h"

Foo::Foo() {
       m_base = new Bar(5);
}

Foo::Foo(int val) {
       m_base = new Baz(val);
}
/* ... */

【讨论】:

  • 请考虑使用std::unique_ptr<Base> 或其他安全的替代new-delete
  • 是的,您当然可以通过各种方式处理内存管理,但我认为这里的问题与类设计更相关。
  • 不可避免地,一些面临此问题并阅读此答案的用户将是初学者。您提供的示例越简洁,对社区的帮助就越大。
  • 与其在构造函​​数中构造对象,不如传递一个已经构造好的对象。
猜你喜欢
  • 2011-12-15
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 2014-06-30
  • 2017-03-19
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多