【问题标题】:class with unknown struct as member具有未知结构的类作为成员
【发布时间】:2020-09-06 13:01:24
【问题描述】:

是否可以将未知结构分配给 c++ 中的类?可能是虚拟功能之类的东西?或者分配一个指向结构的指针?该结构将在构造时分配,然后永远不会改变。

class Class{
  void someFunction(){
    //do something with the struct
  };
  struct unknownStruct;
};

struct Struct1{
    int value1;
} struct1;

struct Struct2{
    int value2;
    int value3;
} struct2;

int main()
{
    Class object1;
    Class object2;
    object1.struct=struct1;
    object2.struct=struct2;
    return 0;
}

【问题讨论】:

  • 您能否创建一个指向base class 的指针来代替您的“unknownStruct”,然后将每个对象的unknownStruct 分配给您想要的任何派生类的任何对象?其他选择是将void* 放在那个地方并存储您想要的任何内容,但是您必须一直担心类型转换。
  • 结构也是类。 structclass 只是声明一个类的两个关键字。唯一的区别是默认访问权限

标签: c++ class struct


【解决方案1】:

你可以使用模板

template<class StructType>
struct Class {
    void SomeFunction() { ... }
    StructType myStruct;
};

如果结构数量有限,则为变体

struct S1 { };
struct S2 { };
struct Class {
    void SomeFunction() { ... }
    std::variant<S1, S2> myStruct;
};

或多态性

struct Base { virtual ~Base() = default; };
struct Class {
    void SomeFunction() { ... }
    std::unique_ptr<Base> myStruct;
};

或者一个简单的空指针

struct Class {
    void SomeFunction() { ... }
    void* myStruct; //std::shared_ptr<void> might be safer to use
    //or maybe std::any.
};

【讨论】:

  • 恕我直言,惯用的方式是unique_ptr。原始指针对于有 C 经验的程序员来说很方便,但需要对销毁和复制进行特殊处理(规则 5)。
  • 我发现前三种方法中的任何一种都可以。我不鼓励使用原始的 void 指针。也许std::any 会更好。
  • 模板会创建结构的副本吗?还是将地址存储到其中?
  • @michox StructType myStruct 复制它。 StructType* myStruct 存储地址。
  • @SergeBallesta unique_ptr 确实比原始的void 指针好得多:)
猜你喜欢
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 2012-03-02
  • 2011-04-19
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
相关资源
最近更新 更多