在C ++中取消引用指向结构的指针

问题描述 投票:0回答:2

我是C ++的新手,我正试图找出如何取消引用结构的指针,以便我可以检索该结构中成员的值。在buildCar()中,我希望能够打印汽车的年份以及汽车的规格(当设置时,它将是指向另一个结构的指针)。我能够打印出存储car1结构的内存地址,但是我无法找出用于推断该指针的正确语法。我尝试使用(*)进行derefencing,而使用 - >代替。引用结构的成员,但到目前为止没有运气。任何帮助表示赞赏。谢谢!

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;
}
c++ pointers struct dereference
2个回答
3
投票

我无法找出用于取消引用此指针的正确语法。

你不能间接通过void指针。您只能间接通过非void指针。

解决方案:更改指针的类型:

struct item {
    int id;
    struct car *myData;
};

然后,您可以使用间接成员访问运算符->访问指向对象的成员。

据推测,可能存在除汽车之外的其他类型的物品,因此可能需要空白*。

在纯C ++中,根据使用要求,有更好的替代方案,如继承,std::variantstd::any

鉴于Mango在评论中提到标题为C,可能无法提供更好的替代方案,而void*可能确实是必要的。

在这种情况下,可以将void指针转换回使用static_cast转换void指针的原始指针类型。转换为错误类型的行为将是不确定的,因此必须非常小心。


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 ++非常重要。

© www.soinside.com 2019 - 2024. All rights reserved.