【问题标题】:how does the structure dereference operator work?结构解引用运算符如何工作?
【发布时间】:2013-06-19 18:22:22
【问题描述】:

我是一名尝试自学 C++ 的 Java 程序员。如果我一开始问简单的问题,请放慢我的脚步。

我想了解结构取消引用运算符的工作原理。具体来说,谁能告诉我以下代码行的明确含义?

    if (elements[i]->test(arga, argb)) {}

test(arga,argb) 是同一类中的布尔函数,elements 是元素类实例的向量。这是紧接在上面一行的代码,我对此很感兴趣:

for (unsigned i = 0; i < elements.size(); ++i) {
    T arga = INFINITY, argb = INFINITY;
    //using namespace std;
    //std::cout >> elements[i] >> std::endl;
    //std::cout >> test(arga, argb) >> std::endl;
    if (elements[i]->test(arga, argb)) {
        //some code
    }
}

似乎 if 行正在测试 test(arga,argb) 返回的布尔值是否是给定元素类实例的一部分。但是,当我尝试使用上面的 cout 行公开 elements[i] 或 test(arga,argb) 的基础值时,编译器会抛出错误,直到我将这些行注释掉。在java中,我可以摆弄这个,直到我找到彼此对应的每个值,然后我就会理解这行代码。但我不知道如何弄清楚这行代码在 C++ 中的作用。谁能给我一个明确的解释,最好通过一两个在线参考的链接来支持?

【问题讨论】:

  • 你能出示elements的声明吗?
  • 为了帮助您理解:在 C++ 中,我们区分 -&gt;.,因为它们不会对相同的事物进行操作(指针与普通对象和/或引用)。但要将您与您的 Java 体验联系起来,您可以大部分-&gt; 翻译成. 即。 elements[i].test(arga, argb)。但请记住,C++ 在值和引用之间有所不同,而在 Java 中,几乎所有内容都是引用。
  • @syam 是对的,但在 C++ 中,您还可以为用户定义的类型定义取消引用运算符。因此,为了了解您的实际要求,有必要知道elememts 是什么,以及它持有什么类型,如果它持有指针以外的任何东西。
  • 感谢大家的帮助。当我有时间深入研究并考虑你们每个人在说什么时,我将登录并探索这个。同时,向迄今为止尝试提供帮助的所有人 +1。
  • @CodeMed:同样,elements 的声明在哪里?在 C++ 中,如果不知道 elements 是什么,就没有有意义的方式来回答您的问题。

标签: c++ vector boolean operators


【解决方案1】:
elements[i]->test (arga, argb)

如果我们分解语句,从从左到右阅读,我们将得到以下结果:

  1. 访问名为elements的数组(或类数组)实体中的ith元素

  2. 访问的元素 (elements[i]) 是指向对象的指针

  3. elements[i] 上调用名为test成员函数 并传递两个参数; argaargb

如果我们无视您写的是 std::cout &gt;&gt; 而不是 std::cout &lt;&lt;(后者是正确的形式)这一事实,我们最终会为您描述的错误提供两个原因:

  1. 您的编译器抱怨std::cout &lt;&lt; element[i],因为没有找到合适的重载来处理element[i]std::ostream&amp; 类型的实体(这是std::cout 的基础类型)。

  2. 您的编译器抱怨std::cout &lt;&lt; test (arga, argb),因为在名为test 的范围内没有函数接受与arga, argv 对应的两个参数。 test,在你的 sn-p 中,是一个属于实体的成员函数,它不能被自己调用。

【讨论】:

    【解决方案2】:

    欢迎使用 C++。

    首先,输出的语法是:

    cout<<
    instead of
    cout>>
    

    你猜对了,test 是一个返回布尔值的函数。这里的 elements[i] 是一个指向具有这个 test 函数的结构元素的指针。

    要学习C++,可以使用我写的these articles。祝你好运!

    【讨论】:

      【解决方案3】:

      由于许多受访者告诉我,我需要提供代码才能回答,所以我更深入地查看了代码,并重新编写了一些内容,告诉我这行:

      if (elements[i]->test(arga, argb)) {}  
      

      是检查elements[i] 的布尔成员函数是否为真的测试。

      在这种情况下,我编写的用于识别 -> 含义的 c++ 程序是:

      #include "stdafx.h"
      #include <vector>
      #include <string>
      #include <iostream>
      
      template<typename T>
      class Bone
      {
      public:
          std::string myName;
          int mySize;
          Bone(const std::string &name, const int &size) : myName(name), mySize(size)
          {}
          bool isBigger(const int &testSize) const
          {
              if (testSize > mySize) return false;
              else return true;
          }
      };
      
      int main(int argc, char **argv)
      {
          std::vector<Bone<float> *> bones;
          // name, location, size
          bones.push_back(new Bone<float>("femur", 10));
          bones.push_back(new Bone<float>("ulna", 4));
          bones.push_back(new Bone<float>("maxilla", 3));
      
          int testSize = 6;
          // test each bone to see if it is bigger than testSize
          for (unsigned i = 0; i < bones.size(); ++i) {
              if (bones[i]->isBigger(testSize)) {
                  std::cout << bones[i]->myName; std::cout << " is bigger than testSize! " << std::endl;
              }
          }
      
          while (!bones.empty()) {
              Bone<float> *thisBone = bones.back();
              bones.pop_back();
              delete thisBone;
          }
          return 0;
      }
      

      感谢所有带领我解决这个问题的人。

      【讨论】:

        猜你喜欢
        • 2012-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-22
        • 2017-03-15
        • 2020-01-29
        • 2011-02-26
        相关资源
        最近更新 更多