struct的问题

时间:2014-04-27 16:18:56

标签: c++

所以我的代码中有两类问题......一般形式是:

“...的左边必须有class / struct / union”:

                      doc.id[j] = NULL;
                      doc.ISBN[j] = NULL;
                      doc.title[j] = NULL;
                      doc.year[j] = NULL;

和“'doc'使用未定义的struct'main :: m_doc'”

struct m_doc doc;

虽然struct m_doc doc包含在每个函数的顶部。

这是我的结构:

struct m_doc{

    char id[30];
    int ISBN[30];
    char title[50];
    char author[50];
    int year[30];
};

我的拳头功能:

void menudoc()
{   struct m_doc doc;
    int c = 0, a = 0, b;
    cout << "1. Them tai lieu moi" << endl;
    cout << "2. Xoa tai lieu" << endl;
    cout << "3. Bao cao theo nam xuat ban" << endl;
    cout << "0. Tro lai menu truoc" << endl;
    cout << "Ban chon:";
    cin >> b;
    switch (b)
    {
    case 1:
    {
              for (int i = 0;; i++)
              {
                  if (doc.id[i] == NULL && doc.ISBN[i] == NULL && doc.title[i] == NULL && doc.author[i] == NULL && doc.year[i] == NULL)
                  {
                      i = c; break;
                  }
                  else continue;
              }
              cin >> doc.author[c] ;
              cin >> doc.id[c] ;
              cin >> doc.ISBN[c] ;
              cin >> doc.title[c];
              cin >> doc.year[c];
              for (int i = 0;; i++){
                  for (int j = 1;; j++){
                      if (doc.id[i] == doc.id[j]){
                          doc.author[j] = NULL;
                          doc.id[j] = NULL;
                          doc.ISBN[j] = NULL;
                          doc.title[j] = NULL;
                          doc.year[j] = NULL;
                      }
                      if (doc.year[i]<1000 || doc.year[i]>9999){
                          doc.author[i] = NULL;
                          doc.id[i] = NULL;
                          doc.ISBN[i] = NULL;
                          doc.title[i] = NULL;
                          doc.year[i] = NULL;
                      }
                  }
              }
              break;
    }


    case 2:
    {
              int x;
    char docid[50];
    cout << "IDDOC: ";
    cin >> docid[50];
    cout << "\n";
    for (int i = 0;; i++){
        if (docid[50] == doc.id[i]) {
            doc.author[i] = NULL;
            doc.id[i] = NULL;
            doc.ISBN[i] = NULL;
            doc.title[i] = NULL;
            doc.year[i] = NULL;
            x++;
        }

    }
    if (x == 0) cout << "IDDOC khong ton tai." << endl;
    break;
    }
    case 3:
    {
              int yeardoc[50];
    cin >> yeardoc[50];
    for (int i = 0;; i++){
        if (yeardoc[50] == doc.year[i])
            write_output(i, "report.scv");

    }
    break;
    }
    case 0:
    {
              menubegin();
              break;
    }
        menudoc();
    }

}

我的第二个功能:

int write_output(int i, char* filename){
    ios::out;
    struct m_doc doc;
    // open file for output
    ofstream fout(filename);
    char * k, *h;
    k = strchr(doc.title, ',');
    h = strchr(doc.author, ',');
    if (k != 0 && h != 0)fout << doc.id[i] << "\n" << doc.ISBN[i] << "\n" << '"' << doc.title[i] << '"' << "\n" << '"' << doc.author[i] << '"' << "\n" << doc.year[i] << endl;
    if (k != 0) fout << doc.id[i] << "\n" << doc.ISBN[i] << "\n" << '"' << doc.title[i] << '"' << "\n" << doc.author[i] << "\n" << doc.year[i] << endl;
    if (h != 0)fout << doc.id[i] << "\n" << doc.ISBN[i] << "\n" << doc.title[i] << "\n" << '"' << doc.author[i] << '"' << "\n" << doc.year[i] << endl;
    // write informations
    if (k == 0 && h == 0)fout << doc.id[i] << "\n" << doc.ISBN[i] << "\n" << doc.title[i] << "\n" << doc.author[i] << "\n" << doc.year[i] << endl;

    // close file
    fout.close();


    return 0;
}

任何人都问我说这是关于范围的事情,但他们都不知道问题,因为一切看起来都很好......请帮助我,非常感谢每一个帮助:)

1 个答案:

答案 0 :(得分:0)

我猜测你对何时使用前向声明以及何时包含结构定义感到困惑。以下是一些指导原则。

前瞻声明
结构的前向声明具有以下形式:

struct m_doc doc;  

此表单用于解析引用符号doc的定义,任何指针或引用。通常,在其他结构或函数声明之前将其放在头文件中,以减少#include个文件的数量。

结构定义
您需要在任何代码之前存在结构定义:

  1. 创建结构的实例
  2. 或之前提到结构细节的任何事情 (成员和方法)。
  3. #include个文件中放置结构
    一种方便的做法是将它放在头文件中,而不是在任何地方键入结构,通常是“.h”表示C语言结构,“。hpp”或“.hh”表示C ++类和结构。因此,当您在源文件中有一个引用该结构的函数(或创建该结构的实例)时,请在该函数使用该文件之前包含该定义的文件。

    大多数编译器都会发出错误

    "left of ... must have class/struct/union "
    

    当它找不到结构的定义或声明时。