C++错误:与“<< Rover::getName()()”中的数据“中的”运算符<<“不匹配

C++ error: no match for 'operator<<' in '"Data for " << Rover::getName()()'

本文关键字:不匹配 运算符 中的 数据 getName 错误 Rover C++      更新时间:2023-10-16

我正在为我的C++类编写一些代码,但我有点卡住了。

这是我正在处理的作业的一部分:


在 Rover 类中,指定以下成员实例变量:

 name (String)
 x position on a grid (integer)
 y position on a grid (integer)
 direction by compass – N, S, E, or W (String)
 speed (0 – 5 meters per second, integer)

在 Rover 类中,指定以下方法:

 No-arg constructor – set the rover’s position to (0,0), its speed to 0, 
  its direction to North,and its name to Default
 Constructor that receives parameters to initialize all five 
  instance variables described above
 Setter methods for each instance variable
 Getter methods for each instance variable
 getRoverData – returns a string that displays values for each instance 
  variable of the current rover object, placing each value on a separate line, 
  as follows:

所以现在我只想让基本情况起作用。这是我的全部代码:


主.cpp:

#include <iostream>
#include "Rover.h"
using namespace std;

int main() {
    Rover rover1;
    rover1.setDefaultValues();
    cout<<rover1.getRoverData(rover1)<<endl;
    return 0;
}

漫游车.cpp:

#include <iostream>
#include "Rover.h"
using namespace std;
//put functions in here
void Rover::setDefaultValues() {
    name = "Default";
    xcoord = 0;
    ycoord = 0;
    direction = "N";
    speed = 0;
}
void Rover::constructRover() {
}
void Rover::setXcoord(int xcoord) {
    this->xcoord = xcoord;
}
void Rover::setYcoord(int ycoord) {
    this->ycoord = ycoord;
}
void Rover::setName(string name) {
    this->name = name;
}
void Rover::setDirection(string direction) {
    this->direction = direction;
}
void Rover::setSpeed(int speed) {
    this->speed = speed;
}
int Rover::getXcoord() {
    return xcoord;
}
int Rover::getYcoord() {
    return ycoord;
}
string Rover::getName() {
    return name;
}
string Rover::getDirection() {
    return direction;
}
int Rover::getSpeed() {
    return speed;
}
string Rover::getRoverData(Rover rover) {
    string printStatement = "";
    printStatement.append("Data for " << rover.getName());
    printStatement.append("nX: " << Rover::xcoord);
    printStatement.append("nY: " << Rover::ycoord);
    printStatement.append("nDirection: " << Rover::direction);
    printStatement.append("nSpeed: " << Rover::speed);
    return printStatement;
}

罗孚:

/* 
 * File:   Rover.h
 * Author: Matthew
 *
 * Created on May 14, 2012, 8:10 PM
 */

#ifndef ROVER_H
#define ROVER_H
using namespace std;

class Rover
{
        private:
            string name;
            int xcoord;
            int ycoord;
            string direction;
            int speed;

    public:
            void setDefaultValues();
            void constructRover();
            //XCoordinates
            void setXcoord(int xcoord);
            int getXcoord();
            //YCoordinates
            void setYcoord(int ycoord);
            int getYcoord();
            //Name
            void setName(string name);
            string getName();
            //Direction
            void setDirection(string direction);
            string getDirection();
            //Speed
            void setSpeed(int speed);
            int getSpeed();
            //Printout
            string getRoverData(Rover rover);
};
#endif  /* ROVER_H */

我目前收到的错误是:

rover.cpp:64: error: no match for 'operator<<' in '"Data for " << Rover::getName()()'

这到底是什么意思?

在这一点上,我希望打印输出说的是:

Data for Default
X: 0
Y: 0
Direction: N
Speed: 0

有什么想法吗?

抱歉,如果代码在我发布时看起来很糟糕......以前没有这样做过。


更新:


#include <iostream>
#include "Rover.h"
using namespace std;
//put functions in here
void Rover::setDefaultValues() {
    name = "Default";
    xcoord = 0;
    ycoord = 0;
    direction = "N";
    speed = 0;
}
void Rover::constructRover() {
}
void Rover::setXcoord(int xcoord) {
    this->xcoord = xcoord;
}
void Rover::setYcoord(int ycoord) {
    this->ycoord = ycoord;
}
void Rover::setName(string name) {
    this->name = name;
}
void Rover::setDirection(string direction) {
    this->direction = direction;
}
void Rover::setSpeed(int speed) {
    this->speed = speed;
}
int Rover::getXcoord() {
    return xcoord;
}
int Rover::getYcoord() {
    return ycoord;
}
string Rover::getName() {
    return name;
}
string Rover::getDirection() {
    return direction;
}
int Rover::getSpeed() {
    return speed;
}
string Rover::getRoverData(Rover rover) {
    string printStatement = "";
    printStatement.append("Data for " + rover.getName());
    printStatement.append("nX: " + rover.getXcoord());
    printStatement.append("nY: " + rover.getYcoord());
    printStatement.append("nDirection: " + rover.getDirection());
    printStatement.append("nSpeed: " + rover.getSpeed());
    return printStatement;
}

所以,现在打印输出是:

Data for Default
X:
Y:
Direction: N
Speed:

所以,它基本上不会打印出零。思潮?

<<是流插入运算符。任何地方都没有采用const char[]左侧和std::string右侧的功能。因此,您会收到错误。

您可以在使用时使用此组合 cout ,但它有点欺骗性。电话:

std::cout << "Some string" << someStdString;

定义为:

(std::cout << "Some string") <<  someStdString;

实际调用等效于:

operator<< (operator<< (std::cout, "Some string"), someStdString);

使其正常工作的是,内部调用返回传入的相同cout,以便它可以与其他调用一起使用。如果您不使用类似cout来表现出这种行为的东西,它的工作方式就不一样了。这也是为什么你可以说:

int i = 5 + 2 + 3;

5 + 2 返回一个 int ,该与 3 相加,并返回分配给 iint

要连接里面的字符串,你可以用加号替换它,因为字符串和字符数组的加法被定义为 std::string 的一部分,或者添加另一个append调用:

printStatement.append("Data for " + rover.getName());
//or
printStatement.append("Data for ");
printStatement.append(rover.getName());
//or
printStatement += "Data for " + rover.getName();

更新:

为了回答您的其他问题,这是C++的另一个功能,不属于Java。我没有意识到您正在将整数添加到其中一些上。当你这样做时,引号中的字符数组实际上会衰减成指针。然后,使用指针算法对整数进行相加。根本不是你想要的。所以基本上你把指针传递到字符串文字的开头,向前移动x字符,其中x是你要添加到它的数字。添加 0 意味着它只是停留在那里,所以整个字符串被传递,+ 0几乎是死代码。

如果要添加整数,

则需要一种方法将整数转换为字符串,然后添加它们。C++11 有stoi,但这与你想要的相反。相反,您可以使用字符串流以及其他方法:

#include <sstream>
int main()
{
    std::stringstream ss;
    ss << 5; //the int to be converted
    std::string s = ss.str(); //get the string
    cout << s + " is the number"; //print with an added string
}