【问题标题】:In C++ how to declare a global, statically allocated variable with a virtual base type?在 C++ 中,如何使用虚拟基类型声明一个全局的、静态分配的变量?
【发布时间】: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 问题,你不明白你想要/需要做什么

标签: c++ memory


【解决方案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 保持其自动生命周期,而不是变为静态。

【讨论】:

    猜你喜欢
    • 2019-02-13
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多