C++ 赋值动态结构
c++ assigning dynamic struct
我真的很想做以下几点:(对语法感到抱歉,我不知道这是如何完成的)
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;
}
如果指针的概念对你来说是新的,你可以在这里阅读它。虚空指针也在那里进行了解释。
- 如何为 c++ 的不同变量类型的结构元素创建动态数组?
- 如何在C++中为堆栈动态创建结构?
- C++具有动态分配的字符数组的结构
- 如何为结构字段动态分配字符空间
- 使用列表进行动态结构分配
- 第一次尝试使用new动态创建结构数组,程序挂起没有错误
- 指向动态内存中结构中的变量时出现问题
- 具有字符串成员的结构的动态数组
- 如何在 c++ 中传递结构的动态数组?
- 指向结构中的数组的指针,其中每个字段都是一个动态数组
- OpenCL 中结构数组中的动态数组
- 结构内动态分配的数组
- 如何在构造函数中初始化结构体的动态数组?
- 使用C++动态分配结构的多维数组
- 如何修复访问动态数组中结构中的字符串变量时"segmentation fault (core dumped)"错误
- C++类内部结构动态分配的方法
- 为结构动态分配内存
- MPI_Send+结构+动态内存分配
- C++ 用户输入的结构动态数组
- 结构继承层次结构-动态下转换