我有一个 C++ 切片问题。我是 C++ 的新手,所以可能太笨了以至于没有意识到这是不可能的……我尝试了多种解决方法,我目前最好的方法如下所示。 (我需要做这样的事情以避免在非常大的遗留代码库中更改大量接口(interface)。不要声称这是任何方式的优雅风格!!)
编译时遇到问题。这个想法合理吗?还是整个方法注定要失败?引用的构造函数似乎是问题所在。我读过 Stroustrup 的“C++ Programming Lanugage”(或者至少我认为是相关部分),但没有帮助。
class FOO {};
class FOOSUBCLASS : public FOO {
public:
FOOSUBCLASS(const int id = 0) : _id(id) {}
private:
int _id;
};
class BAR {
public:
BAR(const FOO foo) : _foo(foo), _realFoo(&_foo) { }
BAR(const FOOSUBCLASS foosc) : _foosc(foosc), _realFoo(&_foosc) {}
private:
FOO _foo;
FOOSUBCLASS _foosc;
FOO& _realFoo;
};
编译器不喜欢我的 _realFoo(&_foo)
行。我希望对 _foo
的引用只是类中成员变量的引用。这在 C++ 中是不可能的吗?
这是来自 VS2005 的特定错误:
'initializing' : cannot convert from 'FOO *' to 'FOO &'
最佳答案
_foo
是 FOO&
.
&_foo
是 FOO*
.
编译器 cannot convert from 'FOO *' to 'FOO &'
.
你要的是..., _realFoo(_foo)
无关:您可能真正想要的是 std::unique_ptr<FOO>
成员(member)代替。这将小得多,并且更不容易出错。
您现在拥有的结构包含 FOO
的完整实例,以及 FOOSUBCLASS
的完整实例, 和一个引用。 至少把两个FOO
union 中的东西,所以大小为BAR
只比最大的 FOO
稍大一点衍生物。这可能会使用与 unique_ptr<FOO>
相同的内存.不幸的是,union
s 是 C 和 C++ 中错误的常见来源。
另一个问题是如果有人过来写
class FOOSOMETHINGELSE : public FOO {
int buffer[1024];
};
然后你必须去找BAR
类并更改它并使其更大,然后重新编译所有使用 BAR
的代码到处。然而,如果您使用 unique_ptr<FOO>
,那么您就不必更改 BAR
或重新编译任何东西。因此出错的机会更小。
关于c++ - C++ 切片的潜在解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12850344/