2015-10-20 31 views
0

所以我发现了在类中定义私有变量的问题。在C++类中定义私有变量/属性

此刻,我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) 

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

当我在别的地方定义一个属性时,问题就出现了,比如在父类/主文件中。

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

我查找了一个制作类的例子,他们没有在.cpp文件中定义类属性,但只在头文件中,它似乎神奇地创建了这些私有属性。 cpp文件(它们没有在.cpp文件中的任何位置定义)。

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

任何人都可以证实:

  1. 这不是C/C++而言,您应该只定义在头文件中的专用属性。

  2. 类.cpp文件中的任何变量/属性都是一些如何在'全局命名空间'中,他们可以在其他文件中碰撞。

而且,如果第二点是真实的,能将它们实际上只是调用另一个类/文件_seeds访问?

,如果你把它们写在类外(它可能不会,因为我认为这仅仅是一个语言的东西无所谓,但是这是代码一个Arduino。)

+0

这听起来对我来说是不可能的。课堂中的属性仅限于课堂。你能发布你的代码吗? – Chiel

+2

TL; DR:应该将_type作为int还是一个string? –

+1

请不要在变量名前面加下划线 - 每个以下划线开头的名字都保留给实现,用作全局名称空间中的名字 – Constantin

回答

2

你定义两个全局变量新, :

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

你只需要像你那样初始化ctor中的非静态成员变量。

+0

中?如果这意味着.cpp文件,那么我猜测点1是正确的然后:只在头文件中定义,并且只在.cpp文件中初始化? – mitim

+0

哦,“构造函数”。没想到直到几分钟后才看到它。 =/ – mitim

+0

@mitim成员变量在类定义中定义,并在类作用域内使用(初始化),包括成员函数(和构造函数)。无论如何,你不能直接在全球范围内使用它们。 – songyuanyao

1

必须声明全部 C++中的一个类的属性和方法。传统的方法是在头文件中完成,因此包含该头文件的所有文件都可以使用该类(它们需要完整的声明才能完成)。但是,.cpp文件中的类声明也是有效的,但仅在该文件中才会提供此类。

您的代码

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

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

+0

没错。其他人在答案中提到了这一点,但你已经再次证实了这一点,也提到了我的第二点。谢谢。是的,你又是对的,int应该是_type的一个字符串。我通常会编辑我的问题并修复这个错字,但可能会让其他人在将来想知道它指的是什么。 – mitim

+0

@mitim我肯定会编辑问题中的属性类型,并在注释中留下提示(例如'String _type; //最初是错误的int)。一个好问题应该解决一个问题,否则它会变得混乱。 – Melebius

+0

好的,好点。 – mitim