所以我发现了在类中定义私有变量的事情。
目前,我的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,在那里我定义了类实现文件中的所有类变量/属性,所以我有点困惑。
任何人都可以确认:
c / c ++的情况并非如此,您只应在头文件中定义私有属性。
类.cpp文件中的任何变量/属性都是“全局命名空间”中的一些变量/属性,它们可能会在其他文件中发生碰撞。
如果第二点是真的,可以通过在另一个类/文件中调用_seeds来实际访问它们吗?
(可能没关系,因为我认为这只是一种语言问题,但这是arduino的代码。)
答案 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
)