Перегрузка оператора =? C ++ - PullRequest
0 голосов
/ 03 мая 2018

У меня возникла проблема при попытке вставить объект из класса, который я создал, в char. Я создаю имя класса Element как часть более крупной программы, но когда я пытаюсь перегрузить оператор =, чтобы я мог получить в переменной char символ, который я получил в элементе obj, ничего не получается ...

Element.h

class Element {

private:
    char val;
public:
    Element();
    Element(char newVal); //check input - throw execption
    ~Element();

friend ostream& operator<<(ostream& os, const Element& obj);
void setElement(char newVal);
char getElement();

void operator= (const Element newVal);
void operator= (char newVal);


};

Element.cpp

#include "Element.h"



Element::Element()
{
    val ='.';
}

Element::Element(char newVal)
{
    if (newVal!='X' && newVal!='O'&& newVal!='.'){
        inputExecption error;
        error.what();
    } else{
        val=newVal;
    }
}

Element::~Element()
{

}

void Element::setElement(char newVal)
{
    if (newVal!='X' && newVal!='O'&& newVal!='.'){
        inputExecption error;
        error.what();
    } else{
        val=newVal;
    }
}

char Element::getElement()
{
    return val;
}

ostream& operator<<(ostream& os, const Element& obj)
{

    return os << obj.val;

}

void Element::operator= (const Element Value){
    val = Value.val;
}

void Element::operator= (char newVal){
    if(val != 'X' && val != 'O'){
        inputExecption a;
        a.what();
    }
    val = newVal;
}


Итак, как я уже сказал, я пытаюсь сделать следующее:

Element x='X';
char c = x; //(c=x.val)
cout<<c<<endl;//Will print X

ТНХ! :)

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

ИМХО, написание оператора неявного преобразования (как предложил 0x499602D2) - это не лучший идея.

Например, предположим, что у вас есть два отдельных файла примерно так:

//File char_utils.hh
#include <iostream>
void accept(char character) { std::cout <<"character: " <<character <<'\n'; }


//File elements_utils.hh
#include <iostream>
void accept(Element const& element) {
    std::cout <<"element.getVal(): " <<element.getVal() <<'\n';
}

Затем, в зависимости от того, что вы включаете в файл реализации (char_utils.hh или elements_utils.hh), вы получите различное поведение, которое может привести ко многим тонким ошибкам и / или интересным поведениям. ;)

Это можно преодолеть, объявив оператор преобразования explicit, т.е.

explicit operator char() const { return val; }

В таком случае вам просто нужно:

Element e{'x'};
char c = static_cast<char>(e);

, который показывает намерение более четко.

Однако, зачем вам вообще нужно использовать неявное преобразование? Особенно, когда вы можете использовать Element::getElement()? И если я могу предложить, я бы использовал другой namin, например, Element::getValue(). Element::getElement() очень сбивает с толку.

Дальнейшее чтение: https://stackoverflow.com/a/16615725/1877420

0 голосов
/ 03 мая 2018

Другими словами, вы пытаетесь преобразовать объект типа Element в объект типа char. Для этого вы можете использовать оператор преобразования:

class Element {
  // ...
  operator char() const { return val; }
};

Оператор присваивания работает только тогда, когда в левой части присваивания используется экземпляр Element.

...