1

我是一名试图自学 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++ 中的作用。任何人都可以给我一个明确的解释,最好通过一个或两个在线参考的链接来支持?

4

3 回答 3

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

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

  1. 访问名为i的数组(或类数组)实体中的第 th 个元素elements

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

  3. 调用名为on的成员函数并传递两个参数;和testelements[i]argaargb

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

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

  2. 您的编译器抱怨,std::cout << test (arga, argb)因为在命名范围内没有函数test接受两个对应于arga, argv. test,在您的代码段中,是属于实体的成员函数,它不能被自己调用。

于 2013-06-22T21:08:09.750 回答
1

欢迎使用 C++。

首先,输出的语法是:

cout<<
instead of
cout>>

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

学习C++,可以参考我写的这些文章。祝你好运!

于 2013-06-22T21:07:47.677 回答
0

由于许多受访者告诉我,我需要在他们回答之前提供代码,因此我更深入地查看了代码,并重新编写了一些内容,告诉我这行:

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

感谢所有让我弄清楚这一点的人。

于 2013-06-24T09:18:06.867 回答