c ++分配动态结构

时间:2015-01-18 04:56:14

标签: c++ dynamic struct

我真的想做以下事情: (抱歉语法,我不知道如何做到这一点)

struct Data {
   int var = 5;
} data;

struct Data2 {
    var;
} data2;

data2.var = data;

cout << data2.var.var; //prints 5

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

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

聚苯乙烯。 我不想做以下事情:

struct Data {
   int var = 0;
} data;

struct Data2 {
    data;
} data2;

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

4 个答案:

答案 0 :(得分:1)

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

#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; ...仅来自main。这是假定的,并且在标准中是合法的;并且您可以省略其参数。但是您必须返回一个int 。)

答案 1 :(得分:0)

  

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

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

#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更改为指针以避免对象切片。如果你想按价值获得它,你将需要跳过许多箍来避免这种情况。

答案 2 :(得分:0)

你可以像这样使用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,这可能会导致意外结果。

答案 3 :(得分:0)

TL / DR :C ++是静态类型的,所以你要做的就是反对thr语言的精神。但是,如果你真的需要,可以在C中使用void *,在C ++中使用boost::any

现在更多关于void *(了解更多关于boost :: any参考其文档)。

void *是一个在内存中保存原始地址的指针。超出此地址的值可以是所有内容:float,int或您的struct。这是用法示例。

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;
}

如果指针的概念对你而言是新的,你可以阅读它here。这里也解释了无效指针。

相关问题