如何在使用header和cpp文件时定义结构?

时间:2017-02-28 06:31:34

标签: c++

我编写了代码,我在main之外定义了一个结构,用于类的排队链表。它基本上看起来像这样:

class Queue
{
public:
    void enqueue (int x);
    void dequeue ();
    void print ();
};

struct queueNode
{
    int data;
    queueNode * next;
    queueNode * prev;
};

queueNode * head;
queueNode * tail;
queueNode * n;

//class functions that use head, tail, and n


int main ()
{

//functions that use head, tail, and n

return 0;
}

这是一个非常非常精简的版本,但是你可以了解它。

问题是,现在我将它分成不同的文件,我无法弄清楚将头部,尾部或n放在哪里。

如果我把它们放在标题中,它们就不会被括起来,所以它们不能只是头文件的尾端。

如果我将它们放在实现文件中,那么main就无法访问它们。我不能#include实现文件,因为它是一个重新定义。

如果我把它们放在main中,它们就无法访问实现文件。

我应该把它们放在哪里?有某种约定吗?

3 个答案:

答案 0 :(得分:1)

我会这样做:

类和结构的声明 - >标题(或单独的标题)。节点变量将被放入源文件(c或cpp),不能直接从外部访问;如果其他源文件需要访问它们 - 您可以为此提供get / set函数。对于源文件也应该来实现类'方法,如果它们不是内联的。

答案 1 :(得分:0)

如果你想拥有

queueNode * head;
queueNode * tail;
queueNode * n;

可以通过你的main函数访问,你通常会将它们放在一个头文件中,以包含在你想要的位置(因为包括一个头文件只是复制粘贴它)或者只是在主函数的主函数上面声明它们。 cpp文件。就这么简单。

像所说的那样,虽然通常最好将定义(类/结构和成员轮廓)放在头文件中以包含在顶部。并充实了源文件中的功能。

通常在声明一个变量/对象时,你就可以在你需要它的地方旁边做,除非需要多个地方,在这种情况下只需将它打入带有包含警卫的标题就可以了。 例如:

的main.cpp

#include "queue.h"
#pragma once

queueNode * head;
queueNode * tail;
queueNode * n;

//class functions that use head, tail, and n


int main ()
{

//functions that use head, tail, and n

return 0;
}

queue.h

class Queue
{
public:
    void enqueue (int x);
    void dequeue ();
    void print ();
};

struct queueNode
{
    int data;
    queueNode * next;
    queueNode * prev;
};

queue.cpp

#include "queue.h"
//queue and other methods should go here.

请记住,如果您编译多个没有ide的源文件,则需要将它们链接在一起。

答案 2 :(得分:-1)

在Queue类中嵌套Node类,创建Queue的tail,head和n个成员。

class Queue {
public:
  struct Node {
    int data_;
    Node * next_;
    Node * prev_;
    Node (const Node& n) : next_ (n.next_), prev_ (n.prev_){}
  };
  void enqueue (int x);
  void dequeue ();
  void print ();
  Node* n () const {return n_;} //read only
  Node*& n () {return n_;}      //read and write
private :
  Node * head_;
  Node * tail_;
  Node * n_;
};

在main中,可以清楚地访问成员尾部和队列,并且有关Queue的所有内容都在一个文件中:

int main () {
  //functions that use head, tail, and n
  Queue queue;
  Queue::Node *node (queue.n ());
  return 0;
}