Ir ao conteúdo
  • Cadastre-se
Cambalinho

C++ - fazer 1 class static

Recommended Posts

eu tenho esta class:

class Pessoa2 //static class
{
private:

public:
static string nome;//tem de ser static
static void showname();
Pessoa2(string strnome)//nao pode ser static
{
nome = strnome;
showname();
}

static void setNome(string strnome)
{

nome = strnome;
showname();
}

static string getNome()
{
return nome;
}
};

void Pessoa2::showname()
{
cout << "named changed" ;
}

quero-a em static, mas esta-me a dar erros:(

"obj\Debug\main.o||In function `ZN7Pessoa2C1ESs':|"

"C:\Users\Joaquim\Documents\CodeBlocks\test2\main.cpp|15|undefined reference to `Pessoa2::nome'|"

desculpa, mas donde vem este nome: 'ZN7Pessoa2C1ESs'???

não é a 1ª vez que apanho este tipo de erros, mas ainda nao entendi porque:(

alguem me pode dar umas dicas?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você inicializou a variável?

As static devem ser inicializadas fora da class usando o operador de contexto pra serem acessadas. No seu caso algo como,

string Pessoa2::nome = "o primeiro valor vai aqui"

Preferencialmente no main() de maneira que todas as demais variáveis de tipo Pessoa2 possam compartilhá-la.

Dica: se quer aplicar as static como algo global, essa não é uma boa pratica. Evite o uso de coisas globais principalmente em POO porque muitos objetos podem modifica-la a qualquer momento de forma que o programa possa comportar-se mal e seja muito difícil de encontrar o erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Você inicializou a variável?

As static devem ser inicializadas fora da class usando o operador de contexto pra serem acessadas. No seu caso algo como,

string Pessoa2::nome = "o primeiro valor vai aqui"

Preferencialmente no main() de maneira que todas as demais variáveis de tipo Pessoa2 possam compartilhá-la.

Dica: se quer aplicar as static como algo global, essa não é uma boa pratica. Evite o uso de coisas globais principalmente em POO porque muitos objetos podem modifica-la a qualquer momento de forma que o programa possa comportar-se mal e seja muito difícil de encontrar o erro.

class Pessoa2 //static class
{
private:

public:
static string nome;//tem de ser static
static void showname();

Pessoa2()
{
nome="ana";
}

static void setNome(string strnome)
{

nome = strnome;
showname();
}

static string getNome()
{
return nome;
}
};

void Pessoa2::showname()
{
cout << "named changed" ;
}

int main()
{
Pessoa2.setNome("joana");//erro

getchar();
return 0;
}

mensagem de errro:

"C:\Users\Joaquim\Documents\CodeBlocks\test2\main.cpp|73|error: expected unqualified-id before '.' token|"

Compartilhar este post


Link para o post
Compartilhar em outros sites


Pessoa2[COLOR="Red"].set[/COLOR]Nome("joana");//erro

mensagem de errro:

"C:\Users\Joaquim\Documents\CodeBlocks\test2\main.cpp|73|error: expected unqualified-id before '.' token|"

De fato, está errado. Releia meu primeiro post e veja que eu não disse nada sobre usar uma função membro que inicialize a variável. É pra inicializa-la diretamente. A variável deve ser inicializada e definida no contexto fora da class.

Releia o primeiro post, corrija e tente de novo pra ver o que nos sai.

Compartilhar este post


Link para o post
Compartilhar em outros sites
De fato, está errado. Releia meu primeiro post e veja que eu não disse nada sobre usar uma função membro que inicialize a variável. É pra inicializa-la diretamente. A variável deve ser inicializada e definida no contexto fora da class.

Releia o primeiro post, corrija e tente de novo pra ver o que nos sai.

desculpa, mas nao entendo o que esta mal:(

class Pessoa2 //static class
{
private:

public:
static string nome;//tem de ser static
static void showname();

Pessoa2(string strnome)
{
nome=strnome;
showname();
}

static void setNome(string strnome)
{

nome = strnome;
showname();
}

static string getNome()
{
return nome;
}
};


int main()
{
Pessoa2("ana");
getchar();
Pessoa2::setNome("joana");

getchar();
return 0;
}

agora esta-me a dar o 1º:(

desculpa, mas por favor me diz o que estou a fazer de erro:(

estou a ter erros que nem me fazem sentido:(

estou a desanimar.. aserio:(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ué, mas era só crtl+c e ctrl+v do primeiro post:


string Pessoa2::nome = "o primeiro valor vai aqui"

Basta, imediatamente antes de iniciar o programa (isso é uma convenção, claro), fora do contexto do main(), inicializar a variável static:


string Pessoa2::nome = "o primeiro valor vai aqui";

int main()
{
}

Compartilhar este post


Link para o post
Compartilhar em outros sites
Ué, mas era só crtl+c e ctrl+v do primeiro post:


string Pessoa2::nome = "o primeiro valor vai aqui"

Basta, imediatamente antes de iniciar o programa (isso é uma convenção, claro), fora do contexto do main(), inicializar a variável static:


string Pessoa2::nome = "o primeiro valor vai aqui";

int main()
{
}

desculpa, mas doi-me a cabeça.. desculpa amigo.

olha 1 coisa posso 'meter' essa linha no construtor predefinido?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, porque como eu comentei antes, a inicialização das static deve ser feita fora da class. Se o fizer no construtor ou qualquer outra função membro da class, voltas a estar dentro da class.

Deves inicializa-la em qualquer outro lugar - de preferência antes do main() - mas não na class.

Agora se o construtor vive num arquivo .cpp independente e não está incluído na .hpp, talvez seja possível inicializar a variável mas, claro, fora do contexto do construtor, ou seja,


// [COLOR="red"]Aqui![/COLOR]
Pessoa2::Pessoa2()
{
// [COLOR="red"]Aqui não, porque estou dentro da class![/COLOR]
}
// [COLOR="Red"]Ou aqui![/COLOR]

Mas não tenho certeza se funcionaria. Melhor antes do main().

Compartilhar este post


Link para o post
Compartilhar em outros sites
Não, porque como eu comentei antes, a inicialização das static deve ser feita fora da class. Se o fizer no construtor ou qualquer outra função membro da class, voltas a estar dentro da class.

Deves inicializa-la em qualquer outro lugar - de preferência antes do main() - mas não na class.

Agora se o construtor vive num arquivo .cpp independente e não está incluído na .hpp, talvez seja possível inicializar a variável mas, claro, fora do contexto do construtor, ou seja,


// [COLOR="red"]Aqui![/COLOR]
Pessoa2::Pessoa2()
{
// [COLOR="red"]Aqui não, porque estou dentro da class![/COLOR]
}
// [COLOR="Red"]Ou aqui![/COLOR]

Mas não tenho certeza se funcionaria. Melhor antes do main().

outra coisa porque nao posso usar variaveis normais numa funçao static?

declarei esta variavel e a usei numa funçao static:

private:
bool firstime=false;
static void setNome(string strnome)
{
if (firstime==false)
{
string nome = "";
firstime=true;
}
showname();
}

mas da-me este erro:

"C:\Users\Joaquim\Documents\CodeBlocks\test2\main.cpp|9|error: invalid use of member 'Pessoa2::firstime' in static member function|"

mas se fizer isto:

static void setNome(string strnome)
{
string nome="ana";
showname();
}

static string getNome()
{
string nome="ana";
return nome;
}

nao me dá erro. mas eu nao sei comparar se a variavel foi inicializada:(

ja tentei com o NULL, mas da-me erro:(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, ai eu já não sei. Não tenho experiencia com coisas static.

Provavelmente variáveis comuns, locais, declaradas e definidas dentro de um função static deve funcionar. Contanto que elas fiquem dentro do contexto {} da função e daí não saiam.

Teríamos que ver a função, o que meteste dentro e que erro dá.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Bom, ai eu já não sei. Não tenho experiencia com coisas static.

Provavelmente variáveis comuns, locais, declaradas e definidas dentro de um função static deve funcionar. Contanto que elas fiquem dentro do contexto {} da função e daí não saiam.

Teríamos que ver a função, o que meteste dentro e que erro dá.

olha este codigo:

class Pessoa2 //static class
{
private:
bool primeiravez=false;//erro: 1 funçao static nao aceita 1 variavel normal
static string nome;//tem de ser static
public:
static void showname();
Pessoa2()
{
nome="ana";
}
Pessoa2(string strnome)//nao pode ser static
{
nome = strnome;
showname();
}

static void setNome(string strnome)
{
static bool a=false;
if(a!=false)
{
string nome="ana";
a=true;
}
showname();
}

static string getNome()
{
static bool a=false;
if(a!=false) string nome="ana";
a=true;
string nome="ana";//se tirar esta linha da-me erro
return nome;
}
};

vê os comentarios.. estranho nao é?

o setNome() parece funcionar, mas o getNome(). se usar cout\return ele da-me erro:

"C:\Users\Joaquim\Documents\CodeBlocks\test2\main.cpp|32|undefined reference to `Pessoa2::nome'|"

mas tem o 'if' mas parece ignorar:(

se usasse o 'try' iria ter erro na mesma, porque isto é erro de compilaçao

Compartilhar este post


Link para o post
Compartilhar em outros sites

Função static só podem acessar valores static.

Imagine o seguinte, temos que registrar os funcionarios, queremos guardar o salario e o valeRefeicao, porém TODOS os funcionarios receberam a mesma coisa de valeRefeicao, é essa a hora de usar static, todas as instancias apontaram para a mesma variavel.

Agora você, tente me explicar o que aconteceria no codigo abaixo, se tivessemos uma função trocaSalario que trocaria o valor da variavel salario(não static)

#include <iostream>
#include <string>

using namespace std;

class Funcionario
{
public:
Funcionario(double salario);
~Funcionario();
static double valeRefeicao;
static void trocaSalario(double salario);
private:
double salario;
};

double Funcionario::valeRefeicao = 800;

Funcionario::Funcionario(double salario)
{
this->salario = salario;
}

Funcionario::~Funcionario()
{
}

//void Funcionario::trocaSalario(double salario)
//{
// this->salario = salario;
//}


int main()
{
Funcionario f(1000);
Funcionario g(1200);

Funcionario::trocaSalario(2000);

getchar();
return 0;
}

Se a função comentada funciona-se como você queria, o salario de quem deveria ser trocado? de f ou g ou os 2?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Função static só podem acessar valores static.

Imagine o seguinte, temos que registrar os funcionarios, queremos guardar o salario e o valeRefeicao, porém TODOS os funcionarios receberam a mesma coisa de valeRefeicao, é essa a hora de usar static, todas as instancias apontaram para a mesma variavel.

Agora você, tente me explicar o que aconteceria no codigo abaixo, se tivessemos uma função trocaSalario que trocaria o valor da variavel salario(não static)

#include <iostream>
#include <string>

using namespace std;

class Funcionario
{
public:
Funcionario(double salario);
~Funcionario();
static double valeRefeicao;
static void trocaSalario(double salario);
private:
double salario;
};

double Funcionario::valeRefeicao = 800;

Funcionario::Funcionario(double salario)
{
this->salario = salario;
}

Funcionario::~Funcionario()
{
}

//void Funcionario::trocaSalario(double salario)
//{
// this->salario = salario;
//}


int main()
{
Funcionario f(1000);
Funcionario g(1200);

Funcionario::trocaSalario(2000);

getchar();
return 0;
}

Se a função comentada funciona-se como você queria, o salario de quem deveria ser trocado? de f ou g ou os 2?

desculpa, mas deixa-me perguntar de outra forma que talvez me ajude e a ti;)

obs: a minha class 'Console' tem 2 funçoes static que me da\altera o titulo da janela e funciona a 100%, porque nao uso variaveis externas ás funçoes. e entendo que as funçoes sendo static posso as usar sem usar objectos(só com o nome da class) apesar de poder, tambem, usar objectos(se tiver errado podes me corrigir).

agora vamos á questao: como posso usar 1 variavel - criada externamente á funçao - dentro da static funçao e inicializa-la?

(ja entendi que a static é inicializada fora da class e de qualquer class\estrutura... mas eu quero evitar isso)

Compartilhar este post


Link para o post
Compartilhar em outros sites
desculpa, mas deixa-me perguntar de outra forma que talvez me ajude e a ti;)

obs: a minha class 'Console' tem 2 funçoes static que me da\altera o titulo da janela e funciona a 100%, porque nao uso variaveis externas ás funçoes. e entendo que as funçoes sendo static posso as usar sem usar objectos(só com o nome da class) apesar de poder, tambem, usar objectos(se tiver errado podes me corrigir).

agora vamos á questao: como posso usar 1 variavel - criada externamente á funçao - dentro da static funçao e inicializa-la?

(ja entendi que a static é inicializada fora da class e de qualquer class\estrutura... mas eu quero evitar isso)

passar a variavel por parametro.

#include <iostream>
#include <string>

using namespace std;

class Funcionario
{
public:
Funcionario(double salario);
~Funcionario();
static double valeRefeicao;
static void trocaSalario(Funcionario &f, double salario);
double salario;
};

double Funcionario::valeRefeicao = 800;

Funcionario::Funcionario(double salario)
{
this->salario = salario;
}

Funcionario::~Funcionario()
{
}

void Funcionario::trocaSalario(Funcionario &f, double salario)
{
f.salario = salario;
}


int main()
{
Funcionario f(1000);

Funcionario::trocaSalario(f, 1500);

cout << f.salario;

getchar();
return 0;
}

Mais uma dica, você deve estar achando uma b*sta as coisas que você não pode fazer com static, mas aceite, você esta errado, existem motivos para isso ser impossivel.

Tive uma epoca, que eu achava uma completa estupides eu não poder declarar variaveis e metodos statics numa Interface (C# e Java), hoje vejo que o estupido era eu.

Compartilhar este post


Link para o post
Compartilhar em outros sites
passar a variavel por parametro.

#include <iostream>
#include <string>

using namespace std;

class Funcionario
{
public:
Funcionario(double salario);
~Funcionario();
static double valeRefeicao;
static void trocaSalario(Funcionario &f, double salario);
double salario;
};

double Funcionario::valeRefeicao = 800;

Funcionario::Funcionario(double salario)
{
this->salario = salario;
}

Funcionario::~Funcionario()
{
}

void Funcionario::trocaSalario(Funcionario &f, double salario)
{
f.salario = salario;
}


int main()
{
Funcionario f(1000);

Funcionario::trocaSalario(f, 1500);

cout << f.salario;

getchar();
return 0;
}

Mais uma dica, você deve estar achando uma b*sta as coisas que você não pode fazer com static, mas aceite, você esta errado, existem motivos para isso ser impossivel.

Tive uma epoca, que eu achava uma completa estupides eu não poder declarar variaveis e metodos statics numa Interface (C# e Java), hoje vejo que o estupido era eu.

o que acho estupido, c++ como poderoso que é, nao deixa que as funçoes static usem variavies normais:(

ja tentei criar 1 variavel static dentro da funçao e nao deu certo:(

desculpa, mas queria evitar inicializar a variavel fora da class:(

Compartilhar este post


Link para o post
Compartilhar em outros sites
o que acho estupido, c++ como poderoso que é, nao deixa que as funçoes static usem variavies normais:(

ja tentei criar 1 variavel static dentro da funçao e nao deu certo:(

desculpa, mas queria evitar inicializar a variavel fora da class:(

Cara, no comentario 12 deste topico eu deixei uma pergunta para você

Se a função comentada funciona-se como você queria, o salario de quem deveria ser trocado? de f ou g ou os 2?

você ainda não me respondeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Cara, no comentario 12 deste topico eu deixei uma pergunta para você

Se a função comentada funciona-se como você queria, o salario de quem deveria ser trocado? de f ou g ou os 2?

você ainda não me respondeu.

se bem entendi: eram os 2 trocados para 2000.

mas para as minhas class static isso nao vai ser problema, porque nao dependem de objectos;)

imagina desta forma: tens class 'Console'(que tem todos os comandos\propriedades da consola\linha de comandos), neste caso nao me ia fazer diferença, porque nao á necessidade de criar objectos;)

Compartilhar este post


Link para o post
Compartilhar em outros sites
se bem entendi: eram os 2 trocados para 2000.

mas para as minhas class static isso nao vai ser problema, porque nao dependem de objectos;)

imagina desta forma: tens class 'Console'(que tem todos os comandos\propriedades da consola\linha de comandos), neste caso nao me ia fazer diferença, porque nao á necessidade de criar objectos;)

Se não tem necessidade de criar objetos crie todas as funções e variaveis static. Pesquise por Singleton.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Se não tem necessidade de criar objetos crie todas as funções e variaveis static. Pesquise por Singleton.

só nao queria inicializar a variavel fora da class:(

mas tem de ser, se for necessario

Compartilhar este post


Link para o post
Compartilhar em outros sites
só nao queria inicializar a variavel fora da class:(

mas tem de ser, se for necessario

Afffffff. Tu não quer usar static por esse motivo ¬¬

E os padrões da linguagem? Vai jogar tudo fora?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Afffffff. Tu não quer usar static por esse motivo ¬¬

E os padrões da linguagem? Vai jogar tudo fora?

nao. mas vou descubrir algo mais tarde;)

ei eu fiz a class variant e funciona a 100%(só nao esta completa para comparaçao e operaçoes, mas esta muito fixe\legal). por isso eu hei-de vir a descubrir algo hehehehe

(ex: em VB6 nao podes usar as barras de deslocamento nos objectos no IDE, mas eu fiz 1 control que permite fazer isso:))

eu nao desisto facilmente;)

muito obrigado por tudo

Compartilhar este post


Link para o post
Compartilhar em outros sites
Singletons!!!

Matheus Maldi, não ensina essas coisas pra ele ou tu já pode imaginar os próximos tópicos, heheheh.

estas a brincar comigo;)

mas lembra-te que quem fez a TV foi gozado até ela sair;)

por isso(deixo o resto para depois hehehhee)

Compartilhar este post


Link para o post
Compartilhar em outros sites

heheheh... tranquilo, "pá" (nao eres de Oporto, sim?). A brincadeira foi mais pelo fato dos singletons serem um tema um tanto polemico. E que se deve usar com muita cautela. E aí como você esta nessa corrida pra revolucionar a computação, pode ser arriscado usa-lo. :D

Compartilhar este post


Link para o post
Compartilhar em outros sites
heheheh... tranquilo, "pá" (nao eres de Oporto, sim?). A brincadeira foi mais pelo fato dos singletons serem um tema um tanto polemico. E que se deve usar com muita cautela. E aí como você esta nessa corrida pra revolucionar a computação, pode ser arriscado usa-lo. :D

sou de Portugal, proximo de Viseu;)

eu nao te levei a mal amigo;)

eu tambem percebo que alguns topicos nao façam sentido a toda a gente(nao podemos agradar a todos hehehe). mas claro que te levei na brincadeira;)

e para ser honesto agradeço a tua ajuda e a dos outros;)

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

×