在 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);

我已经搜索过,但我就是想不通这个语法??

谢谢!

【问题讨论】:

你的概念倒退了。 CarVehicle 的一种类型,而不是相反。您不能实例化基类然后将其分配给派生类。 使用指针类型。你不能初始化一个不完整的类型,只能分配 “初始化为车辆实例”是什么意思? 汽车 &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++ 中,如何使用虚拟基类型声明一个全局的、静态分配的变量?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的动态绑定

C++ 枚举类型声明可以放在 int main 的前面吗?

C++“处理多个基类的虚拟函数”

C++:如何强制派生类设置基成员变量?

C++找到一个或多个多重定义的符号

C ++如何确保在使用虚拟继承时它调用继承而不是基函数