在c++类中定义私有变量/属性

defining private variables/properties in c++ class

本文关键字:变量 属性 定义 c++      更新时间:2023-10-16

所以我发现了在类中定义私有变量的一些事情。

现在,我的Apple.h文件看起来像这样:
#ifndef Apples_h
#define Apples_h
class Apples {
    public:
        Apples();
        void eat();
        void peel();
        void slice();
    private:
        int _seeds;
        String _type; // originally int by mistake
};
#endif

我的Apple.cpp文件如下所示:

#include "Apples.h"
int _seeds = 0; // default
String _type = 0; // default
Apples::Apples(){
    _seeds = 5000;
    _type = "notYummy";
}
// pretend all the public methods are implemented and are fine (no issues with them)

这实际上工作得很好:我在头文件和。cpp文件中定义了一个私有属性_seeds。

当我在其他地方定义属性_seeds时,比如在父类/主文件中,问题就出现了。

然后它抱怨它有多个定义。对我来说,这有点奇怪,因为我认为Apple.cpp中的_seeds属性应该是私有的(因此是未知的),但它以某种方式拾取它并在另一个文件中发生冲突。

我找了一个制作类的例子,他们在那里没有定义。cpp文件中的类属性,而只是在头文件中,它似乎神奇地在。cpp文件中创建了那些私有属性(它们在。cpp文件中的任何地方都没有定义)。

我"最接近"的语言可能是Java,我在类实现文件中定义了所有的类变量/属性,所以我有点困惑。

谁能证实:

  1. 这不是c/c++的情况,你应该只在头文件中定义私有属性。

  2. 类。cpp文件中的任何变量/属性都在"全局命名空间"中,因此它们可以在其他文件中发生冲突。

如果第二个点为真,是否可以通过在另一个类/文件中调用_seeds来访问它们?

(这可能不重要,因为我认为这只是一个语言的事情,但这是arduino的代码。)

如果你在类外编写了两个新的全局变量:

int _seeds = 0; // default
String _type = 0; // default

你只需要初始化函数中的非静态成员变量。

在c++中,必须在一个地方声明所有属性和方法。传统的方法是在头文件中这样做,所以所有包含该头文件的文件都可以使用这个类(它们需要完整的声明才能这样做!)然而,.cpp文件中的类声明也是有效的,但是这样的类只能在.cpp文件中使用。

代码

int _seeds = 0; // default
String _type = 0; // default

与类没有关系。这只是两个全局变量的定义。您可以设置非静态属性的初始值的唯一方法是在构造函数中,您在问题中所做的方式看起来是正确的(假设您使用字符串类型声明Apples::_type而不是int)。