【问题标题】:how can i declare a Class in C++我如何在 C++ 中声明一个类
【发布时间】:2021-02-01 15:00:59
【问题描述】:

我想在 main 方法之前声明类 Person,但它给了我一个错误,即类 Person 未定义

main 方法正在生成对象 Person,但我不知道如何像使用方法一样声明它。

//main Function
int main()
{
    Person person = Person("Majd", 18, 177); //Error "Person class is undefined"
    person.printPerson();
}

class Person
{
    //Private Attributes
    int age;
    int height;
    string name;
    //Public Atributes
public:

    Person(string name, int age, int height) {
        setName(name);
        setAge(age);
        setHeight(height);
    }
    //Getters
    string getName() {
        return name;
    }
    int getAge() {
        return age;
    }
    int getHeight() {
        return height;
    }
    //Setters
    void setName(string name) {
        this->name = name;
    }
    void setAge(int age) {
        this->age = age;
    }
    void setHeight(int height) {
        this->height = height;
    }

    void printPerson() {
        cout << "Name: " << getName() << " Age: " << getAge() << " height: " << getHeight();
    }
};

我这样做是为了学习如何声明类。

【问题讨论】:

标签: c++ declaration declare


【解决方案1】:

如果你 delcare 上面的类 main:

class Person;

那你就可以了

Person * person = 0; 要么 Person * person = some_other_person;

但是如果没有被告知有构造函数可以链接它,就不可能在这里实际创建一个人,或者使用一个人。

你可以将整个类定义移动到文件的顶部,在 main.js 之上。这将暂时解决它。

良好的编程风格是创建一个名为 Person.h 的文件,将您的类放入其中,然后在您的主 cpp 文件中#include "Person.h"。

【讨论】:

  • 不,在Person的定义之前他们将无法做到new Person(whatever)
  • 好的,要学究起来,它需要构造函数的声明,而不是定义。这让你比我更正确,但仍然有点错误。我将编辑我的答案。
  • 我说的没有错。 Person 的定义不是Person 的构造函数的定义。 Person 的定义包含该构造函数的声明。
  • @eerorika 非常正确,但是如果类非常简单,大多数编译器会隐式生成构造函数,但是,使用复制构造函数可以解决一些问题,例如浅拷贝。因此,类的定义应该包括所需构造函数的声明。其他关于构造函数的FAQs
  • 在隐式生成自己的构造函数之前,它需要知道类本身没有定义构造函数,因此它仍然需要类定义的可见性。
【解决方案2】:

类必须始终在主方法或用于实例化对象的方法之前定义。
原因: C++ 从上到下编译(我不是在谈论从左到右或从右到左,这取决于代码行中使用的运算符的关联性),并让编译器存储您想要存在的所有内容类,你必须在使用它之前定义它,但是,等等,这个条件不适用于类的函数或方法的使用,即只有声明可以在它的使用之前存在,但定义也必须存在(可能在之后我们使用函数的代码块)。
当@Andy Newman 谈到头文件时,我想提一个重要的事实。
关于头文件的重要事实:

如果您在使用该头文件内容的块之后包含您的头文件,那么您将收到未声明事物的错误。原因是,当 pre-处理器读取写入 #include "header_file.h" 的行,然后它将立即复制并粘贴该头文件的整个代码(header_file.h) 在你的文件中,如果你在复制粘贴的块之前使用头文件的内容,你最终会得到非声明错误(对于需要定义的类)。

简短摘要:

  1. 始终在从该类实例化任何对象之前定义您的类。
  2. 在您使用该头文件内容的块之前包含头文件(坦率的建议始终包含在文件的开头)。
  3. 在某个块中使用的函数必须在该块之前声明,并且定义也必须存在于代码中的某处。

【讨论】:

    【解决方案3】:

    你应该在“main”函数之前定义你的类。

    class Person 
    {
        //Private Attributes
        int age;
        int height;
        string name;
        //Public Atributes
        public:
    
            Person(string name, int age, int height) {
                setName(name);
                setAge(age);
                setHeight(height);
            }
            //Getters
            string getName() {
                return name;
            }
            int getAge() {
                return age;
            }
            int getHeight() {
                return height;
            }
            //Setters
            void setName(string name) {
                this->name = name;
            }
            void setAge(int age) {
                this->age = age;
            }
            void setHeight(int height) {
                this->height = height;
            }
    
            void printPerson() {
                cout << "Name: " << getName() << " Age: " << getAge() << " height: " << getHeight();
            }
    };
    
    
    //main Function
    int main()
    {
        Person person = Person("Majd", 18, 177); //Error "Person class is undefined"
        person.printPerson();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 2013-06-01
      相关资源
      最近更新 更多