我是C ++的新手,正在尝试弄清楚如何取消对结构的指针的引用,以便可以检索该结构中成员的值。在buildCar()中,我希望能够打印汽车的年份以及汽车的规格(设置后将指向其他结构)。我可以打印出存储car1结构的内存地址,但是我在弄清楚用于引用该指针的正确语法时遇到了麻烦。我尝试使用(*)进行取消引用,然后使用->代替。引用结构的成员,但到目前为止还没有运气。任何帮助表示赞赏。谢谢!
struct item {
int id;
void *myData;
};
struct car {
unsigned int year;
char* specs;
};
void buildCar(item item1);
int main() {
struct item item1;
item1.id = 1;
struct car car1;
car1.year = 2019;
item1.myData = &car1;
buildCar(item1);
}
void buildCar(item item1){
cout << "address of car1 = " << item1.myData;
}
答案 0 :(得分:3)
我在弄清楚用于引用此指针的正确语法时遇到麻烦。
您不能通过void指针间接访问。您只能通过非空指针进行间接操作。
解决方案:更改指针的类型:
struct item {
int id;
struct car *myData;
};
然后,您可以使用间接成员访问运算符->
访问指向对象的成员。
大概还有可能是汽车以外的其他类型的物品,因此可能需要*。
在纯C ++中,根据使用要求,有更好的替代方法,例如继承std::variant
和std::any
。
鉴于Mango在评论中提到标头是C,因此可能没有更好的替代方法,并且void*
的确是必要的。
在这种情况下,可以将void指针转换回使用static_cast
转换为void指针的原始指针类型。转换为错误类型的行为是不确定的,因此必须格外小心。
答案 1 :(得分:0)
因此,让我们从一个基础知识开始:在C ++中,结构是默认为public的类。
您看起来像C,所以我假设这是您的基本语言。
这意味着您可以访问结构中整个类的行为配置。
因此您可以将其重写为:
struct Car {
unsigned int year;
char* specs;
Car(int year) : year(year) {} //Constructor
};
struct Item {
int id;
Car *myData;
Item(int id, Car* car) : id(id), myData(car) {} // Constructor
~Item() { delete myData; } // Destructor. This prevents a potential data leak.
void buildCar() { std::cout << "address of car1 = " << myData; } // Member Function
};
int main() {
Item item1(1, new Car(2019));
item1.buildCar();
}
如果您想知道其中的一些内容,请查找构造函数语法,构造函数初始化器列表和new
运算符,它们对于C ++来说是必不可少的。