Методы друга как константа - PullRequest
0 голосов
/ 27 января 2020

Почему я не могу объявить функцию друга как 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<< не является константой , даже если оно не меняет анимацию внутри класса.

1 Ответ

0 голосов
/ 27 января 2020

Но operator<< не является членом - это бесплатная функция. Так что нет базового объекта, который он не изменяет.

int myFunc() const {
    return 3;
}

Также получает сообщение от компилятора:

error: non-member function 'int myFunc()' cannot have cv-qualifier

Ваша версия operator<< также довольно странная, поскольку она ничего не выводит в поток, который должен, предпочитая вместо этого выводить вещи в std::cout!

Я думаю, вам следует пересмотреть то, чего вы надеетесь достичь, поскольку вы пытаетесь сделать что-то нестандартное. Если вам просто нужен метод, который записывает содержимое вашего класса в std :: cout, просто сделайте это, а не перегружайте оператор.

Обратите внимание, что если у вас есть какой-то другой iostream, вы будете удивлены что ничто не идет в это!

std::ofstream myFile("my_path");
myFile << Player;
...