Ir ao conteúdo

actualizar a minha class variant


Cambalinho

Posts recomendados

Postado

estou actualizar a minha class variant, mas noto erro estranho:(

#ifndef VARIANT_H_INCLUDED
#define VARIANT_H_INCLUDED

#include <cstdlib>
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

class variant
{
private:
bool blnvoid=false;//e o erro aponta esta linha
string a="";
void *b=NULL;

public:

variant()
{
}
variant (string value)
{
blnvoid=false;
a=value;
}

variant (double value)
{
blnvoid=false;
a=to_string(value);
}

variant (int value)
{
blnvoid=false;
a=to_string(value);
}

variant (void *value)
{
blnvoid=true;
b=value;
}

friend istream& operator >>(istream &is,variant &obj)
{
if(blnvoid==false) //e esta
{
is>>obj.a;
}
else
{
is>>obj.b;
}

return is;
}

friend ostream& operator <<(ostream &os,const variant &obj)
{
os << obj.a;
return os;
}

friend istream &getline(istream &in, variant &s1)
{
getline(in, s1.a);
return in;
}

variant & operator = (int const &
{
a=to_string(;
return *this;
}

variant & operator = (string const &
{
a=b;
return *this;
}

variant & operator = (double const &
{
a=to_string(;
return *this;
}

variant & operator = (float const &
{
a=to_string(;
return *this;
}

bool operator == (string const &
{
return (a==;
}

operator string() const
{
return a; // return string member
}
operator double() const
{
return atof(a.c_str()) ;
}
};
#endif // VARIANT_H_INCLUDED

mensagens de erro:

"In function 'std::istream& operator>>(std::istream&, variant&)'"

"error: invalid use of non-static data member 'variant::blnvoid'"

eu nao entendo... o que estou a fazer mal?

Postado

Que eu saiba você não pode definir valor default direito, somente em prototipos tipo assim:

void func(int a= 0);

Já nesse você terá que definir um construtor, ai sim definir os valores default:


private:
variant();
bool blnvoid=false;
string a="";
void *b=NULL;


variant::variant{
blnvoid=false;//e o erro aponta esta linha
a="";
b=NULL;
}

Postado
Que eu saiba você não pode definir valor default direito, somente em prototipos tipo assim:

void func(int a= 0);

Já nesse você terá que definir um construtor, ai sim definir os valores default:


private:
variant();
bool blnvoid=false;
string a="";
void *b=NULL;


variant::variant{
blnvoid=false;//e o erro aponta esta linha
a="";
b=NULL;
}

desculpa, mas nao é esse o problema :(

eu continuo com os mesmos erros:(

Postado

Tente remover o const da declaração de obj:


friend ostream& operator <<(ostream &os,[COLOR="Red"]const[/COLOR] variant &obj)
{
os << obj.a;
return os;
}

Talvez seja isso.

Postado
Tente remover o const da declaração de obj:


friend ostream& operator <<(ostream &os,[COLOR="Red"]const[/COLOR] variant &obj)
{
os << obj.a;
return os;
}

Talvez seja isso.

nao... era outra coisa... eu tinha que usar o blnvoid a partir do obj.

agora estou a tentar usar e testar o ponteiro void:

#ifndef VARIANT_H_INCLUDED
#define VARIANT_H_INCLUDED

#include <cstdlib>
#include <iostream>
#include <string>
#include <algorithm>
#include <stdio.h>

using namespace std;

class variant
{
private:
bool blnvoid;
string a;
void *b;

public:

variant()
{
blnvoid=false;
a="";
b=NULL;

}
variant (string value)
{
blnvoid=false;
a=value;
}

variant (double value)
{
blnvoid=false;
a=to_string(value);
}

variant (int value)
{
blnvoid=false;
a=to_string(value);
}

variant (long value)
{
blnvoid=false;
a=to_string(value);
}

variant (void *value)
{
blnvoid=true;
b=(void*) &value;
}

friend istream& operator >>(istream &is,variant &obj)
{
is>>obj.a;
return is;
}

friend ostream& operator <<(ostream &os,const variant &obj)
{
if (obj.blnvoid==true)
{
os << obj.b;
}
else
{
os << obj.a;
}
return os;
}

friend istream &getline(istream &in, variant &s1)
{
getline(in, s1.a);
return in;
}

variant & operator = (int const &
{
a=to_string(;
return *this;
}

variant & operator = (long const &
{
a=to_string(;
return *this;
}

variant & operator = (string const &
{
a=b;
return *this;
}

variant & operator = (double const &
{
a=to_string(;
return *this;
}

variant & operator = (float const &
{
a=to_string(;
return *this;
}

bool operator == (string const &
{
return (a==;
}

operator string() const
{
return a; // return string member
}
operator double() const
{
return atof(a.c_str()) ;
}
};
#endif // VARIANT_H_INCLUDED

usar:


#include <iostream>
#include <vector>
#include "variant.h"

using namespace std;

class test
{
public:
int a;
};

int main()
{
std::vector<int> b;
b.resize(3);
b[0]=100;
b[1]=200;
b[2]=300;
variant d=&b;//tenho de alterar o construtor para usar o nome da variavel em vez do endereço
cout << d;
return 0;
}

o que recebo é 1 endereço :(

podes me explicar como posso usar o vector e 1 class com a minha variant?

(desculpa, mas quero evitar o boost::any por razoes nao directas de utilizaçao)

Postado
nao... era outra coisa... eu tinha que usar o blnvoid a partir do obj.

Ah, hehe, eu olhei a função errada (<<, quando o erro era na >>). :D

agora estou a tentar usar e testar o ponteiro void:

#ifndef VARIANT_H_INCLUDED
#define VARIANT_H_INCLUDED

#include <cstdlib>
#include <iostream>
#include <string>
#include <algorithm>
#include <stdio.h>

using namespace std;

class variant
{
private:
bool blnvoid;
string a;
void *b;

public:

variant()
{
blnvoid=false;
a="";
b=NULL;

}
variant (string value)
{
blnvoid=false;
a=value;
}

variant (double value)
{
blnvoid=false;
a=to_string(value);
}

variant (int value)
{
blnvoid=false;
a=to_string(value);
}

variant (long value)
{
blnvoid=false;
a=to_string(value);
}

variant (void *value)
{
blnvoid=true;
b=(void*) &value;
}

friend istream& operator >>(istream &is,variant &obj)
{
is>>obj.a;
return is;
}

friend ostream& operator <<(ostream &os,const variant &obj)
{
if (obj.blnvoid==true)
{
os << obj.b;
}
else
{
os << obj.a;
}
return os;
}

friend istream &getline(istream &in, variant &s1)
{
getline(in, s1.a);
return in;
}

variant & operator = (int const &
{
a=to_string(;
return *this;
}

variant & operator = (long const &
{
a=to_string(;
return *this;
}

variant & operator = (string const &
{
a=b;
return *this;
}

variant & operator = (double const &
{
a=to_string(;
return *this;
}

variant & operator = (float const &
{
a=to_string(;
return *this;
}

bool operator == (string const &
{
return (a==;
}

operator string() const
{
return a; // return string member
}
operator double() const
{
return atof(a.c_str()) ;
}
};
#endif // VARIANT_H_INCLUDED

usar:


#include <iostream>
#include <vector>
#include "variant.h"

using namespace std;

class test
{
public:
int a;
};

int main()
{
std::vector<int> b;
b.resize(3);
b[0]=100;
b[1]=200;
b[2]=300;
variant d=&b;//tenho de alterar o construtor para usar o nome da variavel em vez do endereço
cout << d;
return 0;
}

o que recebo é 1 endereço :(

podes me explicar como posso usar o vector e 1 class com a minha variant?

(desculpa, mas quero evitar o boost::any por razoes nao directas de utilizaçao)

Queres passar o conteúdo de um objeto do tipo std::vector para um objeto do tipo variant durante a declaração?

Ué, simples. Basta criar o copy constructor. Ele permite declarar objetos a partir de um previamente existente:


variant::variant(const [COLOR="blue"]std::vector[/COLOR] &

Isso define a ação de


std::vector b;
variant d = b;

Postado
Ah, hehe, eu olhei a função errada (<<, quando o erro era na >>). :D

Queres passar o conteúdo de um objeto do tipo std::vector para um objeto do tipo variant durante a declaração?

Ué, simples. Basta criar o copy constructor. Ele permite declarar objetos a partir de um previamente existente:


variant::variant(const [COLOR="blue"]std::vector[/COLOR] &

Isso define a ação de


std::vector b;
variant d = b;

parece simples, mas dá-me erros ;)


string a;
vector b;//dá erro... eu nao uso o std, porque uso 'using namespace std;'
variant (const vector &value)
{
blnvoid=false;
a=value;
}

std::vector<int> b;
b.resize(3);
b[0]=100;
b[1]=200;
b[2]=300;
string s="hello";
int h=100;
variant d=b;
cout << d(0);

porque o 'a', porque converte os tipos basicos(excepto ponteiros... yah li que tambem é considerado 1 tipo basico) em string. e isso é o ideal para o variant.

mas esta mal este constructor :(

como crio 1 variavel(sem tipo basico) do vector?

Postado
parece simples, mas dá-me erros ;)


string a;
vector b;//dá erro... eu nao uso o std, porque uso 'using namespace std;'
variant (const vector &value)
{
blnvoid=false;
a=value;
}


[/quote]

Mas claro que te dá erros. Tá errado e muito.

O tipo de [COLOR="Blue"]value[/COLOR] é [COLOR="Blue"]std::vector[/COLOR] e o tipo de [COLOR="blue"]a[/COLOR] é [COLOR="blue"]std::string[/COLOR]. Você não pode usar o operador = entre eles. A não ser que você sobrecarregue o operador primeiro, assim o compilador vai saber o que fazer quando o operador operar em objetos de tipos diferentes.

O que você deve fazer é declarar uma variável do tipo [COLOR="Blue"]std::vector[/COLOR] dentro da classe variant de modo a receber o conteúdo da variável de tipo [COLOR="Blue"]std::vector[/COLOR] que está fora.

[code]
class variant
{
std::vector a;
variant (const vector &value)
{
blnvoid = false;
a = value;
}
}

Mas se o que realmente quer, é passar o conteúdo de std::vector a std::string, aí então declare primeiro um vetor do tipo std::string dentro de variant, e faça a conversão elemento a elemento do vetor que está fora da variant para o vetor de strings que está dentro dela, através do copy constructor.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!