在 C++ 中,如何使用虚拟基类型声明一个全局的、静态分配的变量?
Posted
技术标签:
【中文标题】在 C++ 中,如何使用虚拟基类型声明一个全局的、静态分配的变量?【英文标题】:In C++ how to declare a global, statically allocated variable with a virtual base type? 【发布时间】:2018-03-16 14:43:23 【问题描述】:[编辑:抱歉,最初混淆了基类和子类]
给定
class Car : public Vehicle ...
我想声明一个 Vehicle 类型的全局变量(或 &Vehicle,如果需要的话),初始化为 Car 实例......类似于
Vehicle &myCar = Car(red);
... 除了上面没有编译。 对我来说重要的是实例的分配方式与我使用的方式完全相同(这是用于 AVR 编程)
Car myCar(red);
我已经搜索过,但我就是想不通这个语法??
谢谢!
【问题讨论】:
你的概念倒退了。Car
是 Vehicle
的一种类型,而不是相反。您不能实例化基类然后将其分配给派生类。
使用指针类型。你不能初始化一个不完整的类型,只能分配
“初始化为车辆实例”是什么意思?
汽车 &myCar = Vehicle(red);完全不正确。你可以做的是: static Car* _myCar = nullptr;静态车辆* getCar() if(nullptr == _myCar;) _myCar = new Car(red);返回_myCar; ;也需要同步为thread safe。
看起来这是 XY 问题,你不明白你想要/需要做什么
【参考方案1】:
你可以这样做:
Car myActualCar(red);
Vehicle &myCar = myActualCar;
首先创建一个Car
,然后提供一个绑定到汽车的Vehicle
引用。
如果您不想将myActualCar
暴露给文件的其余部分,您可以使用 lambda 函数来隐藏它(这类似于 javascript 中的 IIFE 技术):
Vehicle &myCar = []() -> Car & static Car myActualCar; return myActualCar; ();
此技术需要 C++11。
【讨论】:
谢谢,我正要发布那个;那么有没有办法避免将 myActualCar 变量暴露给程序的其余部分? @SergeyA 的(已删除)答案中有一种方法。我已经投票取消删除它,但它又来了:Vehicle &myCar = []() static Car myActualCar(red); return myActualCar; ();
哇 :) 我接受你的回答。我对 C++ 编译器和 AVR C++ 编译器知之甚少,无法做到 100% 以上将导致目标处理器上的内存分配完全相同,因此我将使用虚拟的“实际”变量。谢谢!【参考方案2】:
如果您不想拥有派生类型的显式变量:
Vehicle &&myCar = Car(red);
右值引用将根据需要延长临时对象的生命周期。与melpomene's lambda solution 相比的优势在于Car
保持其自动生命周期,而不是变为静态。
【讨论】:
以上是关于在 C++ 中,如何使用虚拟基类型声明一个全局的、静态分配的变量?的主要内容,如果未能解决你的问题,请参考以下文章