【问题标题】:C++: pointer to struct in struct definition questionsC++:结构定义问题中指向结构的指针
【发布时间】:2012-04-30 13:41:01
【问题描述】:

考虑那段代码:

struct myStruct
{
    myStruct *next;
};

Next是struct定义中声明的struct的指针,对吧?

- next - 有什么用处?我该如何使用它?

【问题讨论】:

  • 这看起来像一个单链表。
  • 由于您将问题标记为 C++,我想指出您很可能不需要自己创建(单)链接列表,除非出于教育目的。您可以使用std::list 类模板为您执行杂耍指针的繁重工作 - 只需将适合对有效负载建模的类型传递给模板。
  • 但他可能是学生,需要学习数据结构。您不是通过使用标准库来学习数据结构,而是出于教育目的编写它们。然而,在生产代码中,我希望看到人们使用标准库,除非他们有充分的理由不这样做。

标签: c++ pointers struct definition next


【解决方案1】:

似乎它是一个链表的实现。

【讨论】:

  • 不是真正的实现,而是数据结构。
【解决方案2】:

如果您想将这些结构链接在一起以便稍后遍历它们,您可以使用 next。当然,在 myStruct 中有其他成员会更有意义。

示例:

struct myStruct
{
    int       data;
    myStruct *next;
};

myStruct st_1;
myStruct st_2;

st_1.data = 1;
st_2.data = 2;

st_1.next = &st_2; //st_1.next->data is now 2

【讨论】:

    【解决方案3】:

    这个指针的用途是你在myStruct 中实现的任何东西。您可以使用此指针与其他 myStruct 结构(通过指针)保持直接关系并直接操作它们(即像“了解”其他对象一样)。

    例如(请注意,出于所有意图和目的,C++ 中的结构都是公共类),

    class Test
    {
    public:
      doSomethingToTheOtherStruct() {
        if(t != NULL)
          t->touch();
    
      setTouched(bool touch) {
        touched = touch;
      }
    
      setT(Test* other) {
        t = other;
      }
    
      bool isTouched() const {
        return touched;
      }
    
    private:
      Test* t;
      bool touched;
    };
    

    这个类有一些非常简单的方法可以展示使用指针的威力。下面是一个使用它的例子。

    #include <iostream>
    using namespace std;
    int main()
    {
      Test t1;
      Test t2;
      Test* t3 = new Test;
    
      // Notice that we set the pointers of each struct to point to a different one
      // This is not necessary, but is definitely more useful than setting it to itself
      // since you already have the "this" pointer in a class.
      t1->setT(&t2);
      t2->setT(t3);
      t3->setT(&t1);
    
      cout<< t1.isTouched() << t2.isTouched() << t3->isTouched() << endl;
    
      t1->doSomethingToTheOtherStruct();
      t2.doSomethingToTheOtherStruct();
    
      cout<< t1.isTouched() << t2.isTouched() << t3->isTouched() << endl;
    
      delete t3;
    
      return 0;
    }
    

    记下这段代码的结果。 t1 从未设置为被触摸,但无意中(通过指针),t2t3 变为“被触摸”。

    【讨论】:

      【解决方案4】:

      正如其他人指出的那样,它是指向同一个类的指针并且成员变量被称为“next”这一事实表明它是一个链表。

      如果变量是指向同一类但称为“父”的指针,则很可能是某种父/子关系。 (例如 GUI 小部件的父级也是小部件)。

      您可能会质疑为什么允许您这样做:答案是指向数据类型的指针大小相同,因此编译器已经知道它需要多少字节来存储该指针。

      出于同样的原因,您可以在您的类(或结构)中包含一个指向仅声明了数据类型而未定义其数据类型的类型的指针。 (很常见)。

      【讨论】:

        【解决方案5】:

        没错。在linked lists中使用了这种嵌套结构。

        【讨论】:

          猜你喜欢
          • 2010-10-05
          • 1970-01-01
          • 2017-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-14
          相关资源
          最近更新 更多