【发布时间】: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_foo和bar_like_foo不能是foo的子类?printWrapperinfoo然后变成了一个纯虚函数。 -
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