【问题标题】:c++ Call function of union structc++联合结构的调用函数
【发布时间】:2023-01-11 02:47:21
【问题描述】:

我有嵌套结构,其中基础有一个纯虚函数。

(以下示例有点伪,但描述了目的)

struct Base {
    int id=0;
    virtual std::wstring toString() = 0;
}
    
struct Top1 : public Base {
    id=1;
    int val = 5;
    std::wstring toString() { return L"need to use string stream. id="+id+" val="+val; }
}
    
struct Top2 : public Base {
    id=2;
    std::string val = "Hello!";
    std::wstring toString() { return L"need to use string stream. id="+id+" val="+val; }
}

我希望为所有不同的类型创建一个表,所以我创建了这个:

struct BaseFootprint{
    union{
        Top1 top1;
        Top2 top2;
    }
    
    std::vector<BaseFootprint> data;

以下列方式调用函数不起作用:

for(int i=0;i<data.size;i++){
    std::cwout <<data[i].toString()<< std::endl;;
}

我努力了:

std::cwout << ((base)data[i]).toString() << std::endl;

和:

std::cwout << (Top1)data[i].toString() << std::endl;

但它总是说data[i]-&gt; empty

因此,令我失望的是,纯虚函数没有指向正确的顶级函数,这取决于通过联合查看结构数据的方式。

由于我的最终产品将容纳 100 种不同的顶级类型,我希望有一个动态的解决方案,而不是进行硬写的选择。动态解决方案将允许我在不更改基本代码的情况下添加新类型,这正是我所希望的。

如果有一种方法可以按照描述实现这一点,那就太棒了。

【问题讨论】:

  • 你为什么把 Top1 和 Top2 放在一个联合中?
  • 由于您使用的是层次结构,为什么要使用联合进行聚合,即为什么不使用 std::vector&lt;Base*&gt; ?同样,由于您使用的是联合,为什么 hierarchy ,尤其是当没有指向 base 的指针时,要利用虚拟调度
  • fyi Anonymous unions 比 named unions 有更多的限制

标签: c++ struct union virtual


【解决方案1】:

联盟不是正确的工具。
忽略其他编译器错误,您需要访问联合的特定成员(例如data[i].top1)并且您不能访问除最后写入的成员之外的任何成员(这意味着您需要以某种方式记住向量中的哪个成员). std::variant 是类型安全的 union,但您仍然需要大量样板代码才能访问正确的成员。

在 C++ 中使用多态性的正常方法是通过指针:

int main()
{
    std::vector<std::unique_ptr<Base>> data;
    data.push_back(std::make_unique<Top1>());
    data.push_back(std::make_unique<Top2>());
    for (auto& ptr : data)
    {
        std::wcout << ptr->toString();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多