结构解引用运算符如何工作?

时间:2013-06-22 20:58:21

标签: c++ vector boolean operators

我是一名java程序员,试图自学c ++。如果我先问一些简单的问题,请给我一点松懈。

我想了解结构解除引用运算符的工作原理。具体来说,任何人都可以告诉我下面的代码行在明确的术语中做了什么?

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

test(arga,argb)是同一个类中的布尔函数,元素是元素类的实例向量。以下是紧接着上述行的代码,我对此感兴趣:

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 ++中的作用。任何人都可以给我一个明确的解释,最好是通过一个或两个链接在线提供一些参考吗?

3 个答案:

答案 0 :(得分:3)

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

如果我们打破声明,从从左到右阅读,我们最终会得到以下内容:

  1. 访问名为i

  2. 的数组(或类数组)实体中的elements元素
  3. 访问的元素(elements[i])是指向对象的指针

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

  5. 如果我们忽略了您编写std::cout >>而不是std::cout <<(后者是正确的格式)的事实,我们最终会有两个原因导致您所描述的错误:

    1. 您的编译器抱怨std::cout << element[i],因为找不到合适的重载来处理element[i]类型的实体和std::ostream&std::cout的基础类型1}})。

    2. 您的编译器抱怨std::cout << test (arga, argb),因为名为test的作用域中没有函数接受与arga, argv对应的两个参数。您的代码段中的test是属于某个实体的成员函数,它不能自行调用。

答案 1 :(得分:1)

欢迎使用C ++。

首先,输出的语法是:

cout<<
instead of
cout>>

你猜测test是一个返回boolean的函数是对的.Here元素[i]是一个指向具有这个测试函数的struct元素的指针。

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

答案 2 :(得分:0)

由于众多受访者告诉我,我需要在他们回答之前提供代码,我更深入地研究了代码,然后重新写了一些告诉我这一行:

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

是一个测试,看看元素[i]的布尔成员函数是否为真。

我写的c ++程序用于识别 - &gt;的含义在这方面是:

#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;
}

感谢所有让我了解这一点的人。