【问题标题】:Reading class variable读取类变量
【发布时间】:2013-08-21 10:52:53
【问题描述】:

我创建了一个名为“Triangle”的类,现在正试图从主部分读出某个类变量(“SideA”)。我特别将 SideA 声明为“公共”以防止访问问题。 但是,在尝试编译时,程序会抛出错误“Triangle 类没有名为 SideA 的成员”。

我正在为你粘贴最重要的部分:

class Triangle
{
public:
float SideA;
};

int main ()
{
Triangle Object(); //pair is normally filled with several vars for the constructor)

//I declared "Object" correctly, it can be constructed. "SideA" is filled by the 
//constructor. I'm just leaving it out 
//right now to keep this text short

//This line is marked when the IDE aborts the compiling process
cout << Object.SideA;

我希望你能帮助我,因为我真的不知道如何解决这个问题。我正在学习的书籍建议为这些目的使用特殊函数(“void readOut {return X}”),但我真的每次想读出一个数字时都必须编写一个函数吗?

提前谢谢你, JustATestAcc

【问题讨论】:

  • 通常,这些对都填充了构造函数的浮点数,我只是省略了它
  • 谢谢大家的回答
  • @JustATestAcc 如果您的代码有问题,请隔离一个重现问题的最小示例然后发布该示例的实际代码。没有“只为 SO”的简化。由于您遇到无法解决的问题,因此您无法正确判断什么是相关的,什么是不相关的(否则,您会知道问题所在)。 始终确保您发布的代码准确地重现了问题。
  • 抱歉没有更清楚:MVP = 最令人烦恼的解析 = 声明一个不带参数的函数,它是一个变量声明。换句话说,就是你刚才犯的错误。
  • 对不起,不知道。我应该打开一个新问题还是直接覆盖旧问题?

标签: c++ class member


【解决方案1】:

尝试更新

Triangle Object();  // This declares a function which returns Triangle type

Triangle Object;    // this defines Object

另请阅读most vexing parse

如果你是 C++11,你可以用 list initialization 初始化 Object

Triangle Object{};    // value-initialization (to zero)
Triangle Object{2.0}; // direct-list-initialization

【讨论】:

    【解决方案2】:

    设为Triangle Object;

    试试下面..;)

    #include<iostream>
    
    using namespace std;
    
    
    class Triangle
    {
    public:
    float SideA;
    };
    
    int main ()
    {
    Triangle Object; //this defines object
    
    //I declared "Object" correctly, it can be constructed. "SideA" is filled by the
    //constructor. I'm just leaving it out
    //right now to keep this text short
    
    //This line is marked when the IDE aborts the compiling process
    cout << Object.SideA;
    }
    

    【讨论】:

      【解决方案3】:

      那是因为你在写这个的时候没有创建一个 Triangle 的实例:

      Triangle Object();
      

      这在本地(在 main() 范围内)声明了一个函数 Object,其参数列表为空,返回类型为 Triangle。它不会实例化Triangle 类型的对象,因此不会调用实例的默认构造函数。但是,后者显然是您想要的。

      您可以通过简单地编写来修复它:

      Triangle Object;
      cout << Object.SideA;
      

      此外,我建议您不要以大写字母开头的变量名。在许多编码约定中,正如您已经对Triangle 所做的那样,类型以大写字母开头。 Triangle 的实际实例稍后可能会与类型名称混淆,并且不会被识别为类型实例的名称。从上下文中使用的名称将变得很明显它的真正含义,但是必须扫描某事物的上下文以找出它实际代表的内容是乏味且不必要的:

      Triangle object;
      cout << object.SideA;
      

      【讨论】:

      • 谢谢。但是,它通常像“Triangle Object(kathA, kathB, hyp);”,因为我需要这些变量作为构造函数。也可以创建三角形,只是无法读出 SideA。
      • 我不太明白你想说什么。如果你这样做,你将调用构造函数 Triangle::Triangle(T kathA, T kathB, T hyp) (我假设你的三角形边缘都由相同的类型表示)。 SideA 是否仍然是公共成员是正交的。
      【解决方案4】:
      Triangle Object();  // Declare a function Object return a Triangle
      

      这可能是两件事:

      1. Triangle 类变量 Object 的变量定义
      2. 返回三角形类型对象的函数 Object 的函数声明

      C++ 标准要求必须将此 lign 解释为第二点。

      它被称为Most vexing parse

      您可以通过以下方式更改它:

      Triangle Object;
      

      或者在 C++11 中:

      Tirangle Object{}; // Useful when parameters are needed
      

      【讨论】:

        【解决方案5】:

        你可以这样做,Triangle *Object = new Triangle(); 或者,三角形对象;

        【讨论】:

          猜你喜欢
          • 2016-02-07
          • 1970-01-01
          • 2023-04-07
          • 2012-05-21
          • 2019-07-20
          • 1970-01-01
          • 1970-01-01
          • 2018-08-18
          • 1970-01-01
          相关资源
          最近更新 更多