我是一名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 ++中的作用。任何人都可以给我一个明确的解释,最好是通过一个或两个链接在线提供一些参考吗?
答案 0 :(得分:3)
elements[i]->test (arga, argb)
如果我们打破声明,从从左到右阅读,我们最终会得到以下内容:
访问名为i
elements
元素
访问的元素(elements[i]
)是指向对象的指针
test
上调用名为elements[i]
的成员函数并传递两个参数; arga
和argb
如果我们忽略了您编写std::cout >>
而不是std::cout <<
(后者是正确的格式)的事实,我们最终会有两个原因导致您所描述的错误:
您的编译器抱怨std::cout << element[i]
,因为找不到合适的重载来处理element[i]
类型的实体和std::ostream&
(std::cout
的基础类型1}})。
您的编译器抱怨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;
}
感谢所有让我了解这一点的人。