Friend 方法作为常量
Friend methods as Constant
为什么我不能将友元函数声明为 const
?
//Types.h
#pragma once
#include <string>
#include <ostream>
class Player
{
public:
//constructors
Player();
Player(const std::string&, unsigned short);
//operator overload
friend std::ostream& operator<<(std::ostream&, const Player&);
// (I can't declare it as const)
//getter
const std::string& get_id() const;
private:
std::string id;
unsigned short lvl;
};
//Types.cpp
#include "Types.h"
#include <iostream>
#include <iomanip>
/*other definitions*/
std::ostream& operator<<(std::ostream& out, const Player& print)
{
out << "Player: " << std::setw(6) << print.id << " | " << "Level: " << print.lvl;
return out;
}
我的意思是,如果我想在常量变量或常量函数中调用 operator<<
,我会得到一个错误,因为 operator<<
不是 constant,即使它没有改变 class.
中的任何内容
但是 operator<<
不是会员 - 它是免费功能。所以没有它不修改的基础对象。
int myFunc() const {
return 3;
}
编译器也报错:
error: non-member function 'int myFunc()' cannot have cv-qualifier
您的 operator<<
版本也很奇怪,因为它没有将任何内容输出到它应该输出的流中,而是更喜欢将内容输出到 std::cout
!
我认为你应该重新考虑你希望实现的目标,因为你正在尝试做一些非标准的事情。如果您只想要一个将 class 的内容写入 std::cout 的方法,那么只需这样做,而不是重载运算符。
请注意,如果您有一些其他的 iostream,您会惊讶于其中没有任何内容!
std::ofstream myFile("my_path");
myFile << Player;
为什么我不能将友元函数声明为 const
?
//Types.h
#pragma once
#include <string>
#include <ostream>
class Player
{
public:
//constructors
Player();
Player(const std::string&, unsigned short);
//operator overload
friend std::ostream& operator<<(std::ostream&, const Player&);
// (I can't declare it as const)
//getter
const std::string& get_id() const;
private:
std::string id;
unsigned short lvl;
};
//Types.cpp
#include "Types.h"
#include <iostream>
#include <iomanip>
/*other definitions*/
std::ostream& operator<<(std::ostream& out, const Player& print)
{
out << "Player: " << std::setw(6) << print.id << " | " << "Level: " << print.lvl;
return out;
}
我的意思是,如果我想在常量变量或常量函数中调用 operator<<
,我会得到一个错误,因为 operator<<
不是 constant,即使它没有改变 class.
但是 operator<<
不是会员 - 它是免费功能。所以没有它不修改的基础对象。
int myFunc() const {
return 3;
}
编译器也报错:
error: non-member function 'int myFunc()' cannot have cv-qualifier
您的 operator<<
版本也很奇怪,因为它没有将任何内容输出到它应该输出的流中,而是更喜欢将内容输出到 std::cout
!
我认为你应该重新考虑你希望实现的目标,因为你正在尝试做一些非标准的事情。如果您只想要一个将 class 的内容写入 std::cout 的方法,那么只需这样做,而不是重载运算符。
请注意,如果您有一些其他的 iostream,您会惊讶于其中没有任何内容!
std::ofstream myFile("my_path");
myFile << Player;