c++ 结构解引用操作符是如何产生作用的?

jjhzyzn0  于 2023-08-09  发布在  其他
关注(0)|答案(3)|浏览(84)

我是一名Java程序员,我正在自学C++。
我想了解结构解引用运算符是如何工作的。具体来说,下面这行代码的作用是什么?

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)返回的布尔值是否是elements类的给定示例的一部分。但是,当我尝试使用上面的cout行公开elements[i]或test(arga,argb)的底层值时,编译器会抛出错误,直到我注解掉这些行。
在Java中,我可以摆弄它,直到我找到彼此对应的每个值,然后我就可以理解这行代码了。我怎么能弄清楚这行代码在C++中做了什么?我很想在网上看到一些参考资料,如果他们是可用的。

v9tzhpje

v9tzhpje1#

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

字符串
如果我们将语句分解,从 * 左到右 * 阅读,我们将以下面的内容结束:
1.访问名为elements的数组(或类似数组的 *)实体中的第i个元素
1.被访问的元素(elements[i])是指向对象的指针
1.在elements[i]上调用名为testmember-function 并传递两个参数; argaargb
如果我们忽略你写了std::cout >>而不是std::cout <<(后者是正确的形式)的事实,我们最终会有两个原因导致你所描述的错误:
1.你的编译器抱怨std::cout << element[i],因为没有找到合适的重载来处理element[i]类型的实体和std::ostream&(这是std::cout的基础类型)。
1.你的编译器抱怨std::cout << test (arga, argb),因为在名为test的作用域中没有接受两个与arga, argv对应的参数的函数。在你的代码片段中,test是一个属于实体的 member-function,它不能被自己调用。

dly7yett

dly7yett2#

欢迎来到C++。
首先,输出的语法是:

cout<<
instead of
cout>>

字符串
你猜对了,test是一个返回布尔值的函数。这里elements[i]是一个指针,指向一个有这个test函数的结构元素。
要学习C++,你可以使用我写的these articles

33qvvth1

33qvvth13#

由于许多受访者告诉我,我需要在他们回答之前提供代码,我深入研究了代码,并重新编写了一些东西,告诉我这行:

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

字符串
是一个测试,看看元素[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;
}


感谢所有让我明白这一点的人。

相关问题