Ir ao conteúdo
  • Cadastre-se
Cambalinho

[C++ 11] - como alterar o operador '+'?

Recommended Posts

eu tenho 1 funçao para escrita no ecra:

//write
void write()
{
cout <<"";
}

template <typename A, typename ...B>
void write(A argHead, B... argTail)
{
cout << argHead;
write(argTail...);
}

funciona bem, mas queria lhe fazer 1 alteraçao.

imagina que queres juntar 2 strings com o '+'. tenho de juntar '(string)', para funcionar.

então queria alterar o operador '+':

(Console é o nome da class)

friend Console operator + (char *value)
{
string f;
f +=(string) value;
return f;
}

como uso:

Console b;
b.write("hello " + "world");

mas recebo 1 erro:

"C:\Users\Joaquim\Documents\CodeBlocks\My Class\main.cpp|12|error: invalid operands of types 'const char [7]' and 'const char [6]' to binary 'operator+'|"

alguem me pode explicar o que esta mal?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sobrecarregar operadores é um dos, entre muitos, poderosíssimos recursos do C++. Mas que deve ser usado com cautela, heim. E bastante cuidado também. Nesse caso acho que vale a regra do: é bonito resolver problemas da maneira mais simples.

No seu caso, acho que é mais pratico uma simples função soma() inline do tipo:


std::string soma(std::string &texto1, std::string &texto2)
{
return texto1 + texto2;
}

E a usaria

b.write([COLOR="Blue"]soma("hello " + "world")[/COLOR]);

Compartilhar este post


Link para o post
Compartilhar em outros sites
eu tenho 1 funçao para escrita no ecra:

//write
void write()
{
cout <<"";
}

template <typename A, typename ...B>
void write(A argHead, B... argTail)
{
cout << argHead;
write(argTail...);
}

funciona bem, mas queria lhe fazer 1 alteraçao.

imagina que queres juntar 2 strings com o '+'. tenho de juntar '(string)', para funcionar.

então queria alterar o operador '+':

(Console é o nome da class)

friend Console operator + (char *value)
{
string f;
f +=(string) value;
return f;
}

como uso:

Console b;
b.write("hello " + "world");

mas recebo 1 erro:

"C:\Users\Joaquim\Documents\CodeBlocks\My Class\main.cpp|12|error: invalid operands of types 'const char [7]' and 'const char [6]' to binary 'operator+'|"

alguem me pode explicar o que esta mal?

Você não entendeu a sobrecarga de operador. Você não pode somar 2 'const char[x]', mas pode somar 2 string.

	string str1 = "Hello ";
string str2 = "World";

string result = str1 + str2;

isso funciona porque dentro da classe string tem a sobrecarga que permite isso. E também pode somar uma string + const char[x].

	string str1 = "Hello ";

string result = str1 + "world";

na linguagem C/C++ você não vai conseguir somar deste jeito. O melhor a fazer é:

#include <string>
#include <iostream>

using namespace std;

class Console
{
public:
static void Write(string arg0)
{
cout << arg0;
}
};


int main()
{
Console::Write(string("Hello") + " World" + "!");

getchar();
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites
Você não entendeu a sobrecarga de operador. Você não pode somar 2 'const char[x]', mas pode somar 2 string.

	string str1 = "Hello ";
string str2 = "World";

string result = str1 + str2;

isso funciona porque dentro da classe string tem a sobrecarga que permite isso. E também pode somar uma string + const char[x].

	string str1 = "Hello ";

string result = str1 + "world";

na linguagem C/C++ você não vai conseguir somar deste jeito. O melhor a fazer é:

#include <string>
#include <iostream>

using namespace std;

class Console
{
public:
static void Write(string arg0)
{
cout << arg0;
}
};


int main()
{
Console::Write(string("Hello") + " World" + "!");

getchar();
return 0;
}

isso eu entendi, mas posso fazer 1 macro ou algo identico para evitar usar a 'string()' ou '(string)'?

eu entendo que essa é a unica forma de juntar os char *. mas será que posso alterar isso na minha funçao? para poder usar o '+', normalmente?

(desculpem insistir, mas queria saber se existe alguma forma de poder usar o '+' para somar as strings sem usar funçoes ou converçoes(gosto de ser directo))

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, ter tem. Mas mais uma vez, evite sobrecarregar operadores se não necessário.

Se você tem um char* e gostaria de adiciona-la a uma string (imagino que preferencialmente ao final desta), use o método já pronto pra isso que é std::string::append() da biblioteca <cstring>.

A assinatura da função é:

std::string &[COLOR="blue"]std::string::append(const char* texto)[/COLOR];

Se ainda insistir em mudar o operador, faça isso dentro da função operator+(). Mas esse não é o caminho direto. Afinal você está invocando dois métodos pra resolver um problema que normalmente necessitaria um. A qualidade do código já está comprometida.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Bom, ter tem. Mas mais uma vez, evite sobrecarregar operadores se não necessário.

Se você tem um char* e gostaria de adiciona-la a uma string (imagino que preferencialmente ao final desta), use o método já pronto pra isso que é std::string::append() da biblioteca <cstring>.

A assinatura da função é:

std::string &[COLOR="blue"]std::string::append(const char* texto)[/COLOR];

Se ainda insistir em mudar o operador, faça isso dentro da função operator+(). Mas esse não é o caminho direto. Afinal você está invocando dois métodos pra resolver um problema que normalmente necessitaria um. A qualidade do código já está comprometida.

desculpa, mas deixa-me perguntar desta forma:

tenho a minha funçao write:

template <typename A, typename ...B>
void write(A argHead, B... argTail)
{
cout << argHead;
write(argTail...);
}

posso alterar a funçao de tal forma que aceite o '+' para juntar as strings literais(diretamente... sem funçoes adicionais)?

(nao me leves a mal em insistir.. se nao der para fazer isso nos proprios argumentos, eu desisto)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu acho que não. Mas por via de duvidas vou dizer apenas que não sei. Esperamos que alguém solucione a duvida aí.

Estamos falando de um operador binário (+) operando sobre tipos distintos (char* e std::string), então acho que é implícito alguma conversão em algum momento. De um deles, ou ambos. Nem que seja algo mais minimalista como um reinterpret_cast<const char *>.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Eu acho que não. Mas por via de duvidas vou dizer apenas que não sei. Esperamos que alguém solucione a duvida aí.

Estamos falando de um operador binário (+) operando sobre tipos distintos (char* e std::string), então acho que é implícito alguma conversão em algum momento. De um deles, ou ambos. Nem que seja algo mais minimalista como um reinterpret_cast<const char *>.

eu nao queria fazer assim:

b.write((string)"hello" + " world");

mas nao é mt grave, porque a minha nova linguagem pode detectar a 'soma' de strings e aí eu consigo alterar;)

muito obrigado por tudo amigo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×