Перегрузка операторов ввода и вывода C++ [дубликат]

218
10 июня 2018, 07:20

На данный вопрос уже ответили:

  • Что такое “Правило одного определения” (One definition rule)? 1 ответ

Пытаюсь реализовать перегрузку операторов ввода и вывода в поток для класса. Код следующий:

#pragma once
#ifndef MYSTRING_H
#define MYSTRING_H
#include <iostream>
#include <stdexcept>
#include <cstdlib>
using namespace std;
/*Namespace for a MyString class*/
namespace str {
    /*MyString class*/
    class MyString {
        char* string = nullptr;
        size_t* size = nullptr;
    public:
        MyString();
        MyString(char* const new_string);
        MyString(const MyString& input_string);
        MyString(const size_t& size, const char& symbol);
        ~MyString();
        size_t length() const;
        char* c_str() const;
        char& operator[](const int& n);
        char* operator=(char* const input_string);
        friend ostream& operator<<(ostream& stream, const MyString& output_string);
        friend istream& operator>>(istream& stream, MyString& input_string);
    };

    ostream& operator<<(ostream& stream, const MyString& output_string) {
        stream << output_string.string;
        return stream;
    }
    istream& operator>>(istream& stream, MyString& input_string) {
        char* input_data = nullptr;
        int counter = 0;
        char symbol;
        while (true) {
            if ((symbol = stream.get()) != '\n') {
                input_data = (char*)realloc(input_data, ++counter);
                input_data[counter - 1] = symbol;
            }
            else {
                input_data = (char*)realloc(input_data, ++counter);
                input_data[counter - 1] = 0;
                break;
            }
        }
        input_string.string = new char[counter];
        strcpy_s(input_string.string, counter, input_data);
        *input_string.size = input_string.length();
        return stream;
    }
}
#endif // MYSTRING_H

Делаю как в этом примере. Получаю ошибку:

fatal error LNK1169: one or more multiply defined symbols found

Реализация остальных методов - в отдельном файле cpp. Проблема именно с операторами ввода и вывода.

Что я делаю не так? VS17.

Answer 1

Думаю, что включаете этот h-файл (содержащий не-inline определения операторов) в несколько .cpp-файлов. тем самым нарушая правило одного определения...

READ ALSO
Несовпадение брейкпоинтов с кодом

Несовпадение брейкпоинтов с кодом

Периодически замечаю, что в студии слетают брейпоинтыРаньше помогал clean - rebuild

177
Не могу создать проект с тестами Google Tests

Не могу создать проект с тестами Google Tests

Почему нет возможности создать проект Google Test в Visual Studio Community 2017? В инсталлере установлен адаптер тестов для Google Tests

166
всёравно файл не компилиться там какие-то ошибки port.cpp

всёравно файл не компилиться там какие-то ошибки port.cpp

сначала выкладываю сообщение об ошибках:

197