结构问题(C++)

Problems with Structs (C++)

本文关键字:C++ 问题 结构      更新时间:2023-10-16

我想使用Struct,但不知道在哪里定义它。这是我目前的代码:

头文件(Datos.h)

#ifndef DATOS_H
#define DATOS_H
using namespace std;
class Datos {
public:
    Datos();
    void rellenarDatos();
    struct KeyData;
    struct BBDD;
};

实现文件(Datos.cpp)

#include <string>
#include <string.h>
#include "Datos.h"
using namespace std;
Datos::Datos() {  
};
struct KeyData {
        int Key;
        string data;
};
struct BBDD {
    KeyData DNI[N];
    KeyData Nombre[N];
    KeyData Apellido[N];
    KeyData Direccion[N];
};
void Datos::rellenarDatos() {
    BBDD.DNI[i].Key = 100;
    BBDD.Nombre[i].Key = 100;
    BBDD.Apellido[i].Key = 100; 
    BBDD.Direccion[i].Key = 100;
    BBDD.DNI[i].data = "hello";
    BBDD.Nombre[i].data = "hello";
    BBDD.Apellido[i].data = "hello";
    BBDD.Direccion[i].data = "hello";   
};

编译器会删除如下错误:

Datos.cpp:25:7: error: expected unqualified-id before ‘.’ token
   BBDD.DNI[i].Key = 100;

问题出在哪里?谢谢

有几个问题。

首先,BBDD是一种类型,而不是对象
这是错误消息的直接原因。

其次,在类定义中,在类Datos的作用域中向前声明了两个structs。

它们的全名是Datos::KeyDataDatos::BBDD,所以要定义它们,可以编写

struct Datos::KeyData {
        int Key;
        string data;
};
struct Datos::BBDD {
    Datos::KeyData DNI[N];
    Datos::KeyData Nombre[N];
    Datos::KeyData Apellido[N];
    Datos::KeyData Direccion[N];
};

另一方面,看起来您想要一个类型为BBDD的成员
在这种情况下,将定义放入类定义中:

class Datos {
public:
    Datos();
    void rellenarDatos();
    struct KeyData {
        int Key;
        string data;
    };
    struct BBDD {
        KeyData DNI[N];
        KeyData Nombre[N];
        KeyData Apellido[N];
        KeyData Direccion[N];
    };
    BBDD bbdd;
};
// ...
void Datos::rellenarDatos() {
    // ...
    bbdd.DNI[i].Key = 100;
    // ...
};

结构是类似于类的数据结构。您现在所做的是定义一个BBDD类型的数据结构。若要访问此结构的成员,您需要定义此结构的实例。您可以作为类中的类成员或作为全局变量来执行此操作。只是不要忘记,对于structs,您需要将关键字struct附加到定义中。

当您声明类的结构成员时,问题出现在头文件中:

struct KeyData;
struct BBDD;

当您定义一个结构时,它就变成了一个类型。如果要使用它,必须创建它的实例,而不是声明另一个结构。假设我想要一个名为Classroom的结构,它包含房间编号和在那里教授的科目。我会像你的.cpp文件中的结构一样定义它:

struct Classroom {
     int roomNumber;
     string subject;
}

现在,当我想使用它时,我使用Classroom,而不是struct:

Classroom myClassroom;
myClassroom.roomnumber = 25;
myClassroom.subject = "Computer Science";

所以在你的情况下,而不是写

struct KeyData;
struct BBDD;

你应该写:

KeyData KeyData;
BBDD BBDD;

尽管我建议更改结构名或实例名,使它们不完全相同,以避免混淆和潜在的编译器错误!

EDIT:请注意,这并不能解决代码中的所有错误-在未声明的变量片段中还有一些其他问题(如果.cpp中的"N"answers"i"在其他地方定义,则这对您来说可能不是问题),您必须根据需要将其声明或传递为参数,但以上内容将修复结构声明中的错误。