【问题标题】:Private Variable Compile Error: Variable is Private私有变量编译错误:变量是私有的
【发布时间】:2014-03-24 16:30:17
【问题描述】:

我有以下代码:

class Point{
private:

    double x, y;
public:
    Point(){
        this->x = 0;
        this->y = 0;

    }
//...
};

我在双精度 x 和 y 的私有声明中遇到错误:

'double Point::y' is private

当我将代码重新排列为:

class Point{
//private:
public:

    double x, y;
    //public:
    Point(){
       this->x = 0;
       this->y = 0;

    }   
//...
};

但显然 double 不是私有的。如果没有给出 private 关键字并且在 public 关键字之前声明双精度,我会得到相同的私有变量错误。

我做错了什么/如何正确声明私有变量? 谢谢!

我在类中和双打声明中都有 Eclipse 中的错误制造者:(我在代码中放置了一个 X,因为我无法发布屏幕截图)

class Point{
private:
//public:

    X double x, y;
    X Point(): x{0},y{0}{
}

已解决:感谢 Dieter Lücking 指出,在我的示例中,当我提供完整的代码示例时,我忘记取消注释 public 关键字。在我编写的代码中更进一步:

cout << "\nPoint sum: " << e.x + e.getY();

奇怪的是,这导致错误同时出现在 cout 行和声明行上,这就是造成我困惑的原因。修复 cout 线:

cout << "\nPoint sum: " << e.x + e.getY();

解决了所有的错误。谢谢大家!

【问题讨论】:

  • 我建议你开始使用构造函数初始化列表。
  • 你的意思是?:Point(): x{0},y{0}{ }
  • 我不相信您在声明时会收到错误消息。您的代码将编译得很好。检查您未在此处发布的代码。在您访问 x 和 y 的地方,这就是您遇到问题的地方。
  • @iceburg,是的,我就是这个意思。
  • 在完整的代码中都是私有的

标签: c++ private


【解决方案1】:

需要注意的最重要的一点是,在您的main 函数中,您尝试直接访问xy,而不是使用访问器函数getX()getY()

另一件事是(可能是由于最近的编辑)您在Point 中的所有成员函数都是private。只需取消注释 c'tor 之前的 //public: 行即可。

【讨论】:

  • 我没有看到任何访问器函数 getXgetY 声明。
  • 它们是在完整的代码示例中声明和定义的。
  • @OP:顺便说一句,我觉得getSin 这个名字很荒谬,而sin 这个名字来自数学。同样,一个有std::string::length,而不是std::string::getLength。等等。因为一般来说,在 C++ 中,get 前缀只会产生负面影响,而且会很冗长。在极少数情况下它可能有用,但大多数情况下,它的贡献是负面的(与支持自省的 Java 中的情况相反)。
【解决方案2】:

撰写此答案时显示的代码不是问题。

编译器抱怨一些其他代码访问Point 实例的private 成员。

对于一个简单的Point 类,没有特殊的类不变量,将成员公开是一个好主意,但请注意一般不是一个好主意.


由于您有 double 类型的 x 和 y 成员,请注意,至少一些不是很久以前的 Visual C++ 版本在优化涉及通过派生类中的访问器方法访问的此类值的表达式时存在问题。我不知道为什么。但将这些成员公开是另一个实际的理由。

【讨论】:

  • 谢谢。我设计整个程序只是为了让自己熟悉 C++,所以点类相当……毫无意义。但我确实希望能够正确地将一些变量声明为私有。错误地尝试访问其他地方的私有变量的代码会触发变量声明中的错误吗?
  • 它会导致一些编译错误(诊断),是的
  • 我认为它会在错误访问的行上导致编译错误,但不认为它会在声明时导致编译错误......很高兴知道。谢谢:)
  • @iceburg:不,它不会在声明时导致编译错误。仅在尝试访问时。抱歉,如果不清楚。
【解决方案3】:

在函数templateTestSum() 中,您正在访问point 的私有成员xy

cout << "\nPoint sum: " << e.x + e.y;

这是不允许的。

【讨论】:

    猜你喜欢
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    相关资源
    最近更新 更多