在c ++类

时间:2015-10-20 07:13:14

标签: c++ class

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

目前,我的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文件中的任何变量/属性都是“全局命名空间”中的一些变量/属性,它们可能会在其他文件中发生碰撞。

  3. 如果第二点是真的,可以通过在另一个类/文件中调用_seeds来实际访问它们吗?

    (可能没关系,因为我认为这只是一种语言问题,但这是arduino的代码。)

2 个答案:

答案 0 :(得分:2)

如果你在课堂外写一个全局变量,你就是新定义的两个全局变量:

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

您只需要像处理一样初始化ctor中的非静态成员变量。

答案 1 :(得分:1)

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

您的代码

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

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