C++ 赋值动态结构

c++ assigning dynamic struct

本文关键字:结构 动态 赋值 C++      更新时间:2023-10-16

我真的很想做以下几点:(对语法感到抱歉,我不知道这是如何完成的)

struct Data {
   int var = 5;
} data;
struct Data2 {
    var;
} data2;
data2.var = data;
cout << data2.var.var; //prints 5

基本上,我想在结构中有一个动态结构变量,该变量可以赋予任何结构作为值并通过mains结构访问它。

请善待。我真的不知道如何更好地解释它,我真的很想这样做,并且一直在阅读很多,但还没有找到任何方法来做到这一点。

附言。我不想执行以下操作:

struct Data {
   int var = 0;
} data;
struct Data2 {
    data;
} data2;

我希望它是动态的,也就是说,我可以在程序期间随时更改它。谢谢。

从概念上讲,您可能(?)询问参考文献:

#include <iostream>
int main() {
    int x = 10;
    int & xref = x;
    std::cout << xref << "n";
    x = 20;
    std::cout << xref << "n";
}

这将打印:

10
20

引用的基础本质上是一个指针,但它永远不能为空......从符号上讲,您不必"取消引用"它。 如果您使用指针,上面的内容如下所示:

#include <iostream>
int main() {
    int x = 10;
    int * xptr = &x;
    std::cout << *xptr << "n";
    x = 20;
    std::cout << *xptr << "n";
}

在这里,它们以最少的更改应用于您的示例:

#include <iostream>
struct Data {
   int var;
};
struct Data2 {
    Data & var;
};
int main() 
{
    Data data = {5};
    Data2 data2 {data};
    std::cout << data2.var.var << "n";
    data.var = 10;
    std::cout << data2.var.var << "n";
    return 0;
}

可能性是"这不是你真正想要的"(你通常不应该公开成员变量,更不用说引用其他变量的成员变量了)。 而且它们不应该都命名为var. 等。

尽管如此,参考文献仍然是该语言不可或缺的一部分,值得学习。

(注意:为简洁起见,您可以省略return 0;...仅从主。 这是假设的,并且在标准中是合法的;你可以省略它的参数。 但你必须返回一个 int。

你可以像这样使用 void 指针:

#include <iostream>
using namespace std;
struct Data
{
    int var;
}data;
struct Data2
{
    void *var;
}data2;
int main()
{
    data.var = 5;
    data2.var = &data;
    cout<<((Data *)data2.var)->var<<endl;
    return 0;
}

但这并不安全,因为有时您无法确保其他结构具有名为 var 的成员,这可能会导致意外结果。

基本上我想在一个结构中有一个动态结构变量 可以赋予任何结构作为值,并通过电源访问它 结构。

可以使用多态性来模拟动态类型的效果。以下是您的案例的测试示例。

#include <iostream>
using namespace std;
struct BaseDataStruct
{
    virtual int get_data() = 0;
};
struct Data : BaseDataStruct
{
    int var = 5;
    virtual int get_data() { return var;}
} data;
struct Data2 {
  BaseDataStruct* var;
} data2;

int main() 
{
    data2.var = &data;
    cout<<data2.var->get_data();
    return 0;
}

通过使用 BaseDataStruct 作为Data2::var预期指向的所有结构的接口基类,可以实现您尝试获取的"动态类型"行为。

注意:我将Data2::var a 更改为指针以避免对象切片。如果你想按值来避免这种情况,你将需要跳过许多箍。

TL/DR:C++是静态类型的,所以你想做的是违背语言的精神。但是,如果你真的必须这样做,你可以在 C 中使用 void* 并在 C++ 中使用 boost::any

现在了解更多关于 void* 的信息(要了解有关 boost::any 的更多信息,请参阅其文档)。

void* 是一个在内存中保存原始地址的指针。这个地址之外的值可以是所有内容:float、int 或你的结构。下面是使用示例。

struct Data {
    int var = 5;
};
struct Data2 {
    void* var;
};
int main() {
    Data data;
    Data2 data2;
    data2.var = (void*)(&data);
    cout << ((struct Data*)data2.var)->var << endl;
}

如果指针的概念对你来说是新的,你可以在这里阅读它。虚空指针也在那里进行了解释。