Ir ao conteúdo

class's e 'propriedades'


Cambalinho

Posts recomendados

Postado

class sprite2
{
bool Visible;
};

imaginemos que temos 2 variaveis do sprite2(a,B).

se alterar o valor Visible da variavel a, a variavel b tambem é alterada?

(eu estou com duvidas sobre isto)

Postado

Por default variáveis e métodos são private e ficam invisíveis externamente.

Nesse trecho que você postou, Visible é apenas uma variável do tipo bool e não uma instrução da classe. Nesse caso, Visible é private independente do valor atribuído na classe.

Para tornar uma variável visível fora da classe, usa-se a palavra chave public.

Postado
Por default variáveis e métodos são private e ficam invisíveis externamente.

Nesse trecho que você postou, Visible é apenas uma variável do tipo bool e não uma instrução da classe. Nesse caso, Visible é private independente do valor atribuído na classe.

Para tornar uma variável visível fora da classe, usa-se a palavra chave public.

então tenho de fazer as funçoes GetVisible() e SetVisible() para nao ter problemas entre as class's?

eu fiz este teste:

class test
{
private: bool blnVisible;
public: bool Visible(bool visible=blnVisible)
{
blnVisible=visible;
return visible;
}

};

mas obtenho este erro:

"--------------------Configuration: Sprite2 - Win32 Debug--------------------

Compiling...

Test Sprite2.cpp

C:\Users\Joaquim\Documents\Visual C 98\Sprite2\Test Sprite2.cpp(9) : error C2648: 'blnVisible' : use of member as default parameter requires static member

C:\Users\Joaquim\Documents\Visual C 98\Sprite2\Test Sprite2.cpp(8) : see declaration of 'blnVisible'

Error executing cl.exe.

Sprite2.exe - 1 error(s), 0 warning(s)"

alguem me pode auxiliar?

Postado

Você tem que criar os métodos get/set.


class test{
bool visivel;

public:
void setVisivel(bool v){
visivel = v;
}

bool getVisivel(){
return visivel;
}
};


x.setVisivel(true);
cout << x.getVisivel() << endl;

Postado
Você tem que criar os métodos get/set.


class test{
bool visivel;

public:
void setVisivel(bool v){
visivel = v;
}

bool getVisivel(){
return visivel;
}
};


x.setVisivel(true);
cout << x.getVisivel() << endl;

desculpa, o meu metodo inicial nao funciona?

(apesar de ter 1 erro)

Postado

No seu método, se você remover '= blnVisible' do parâmetro vai funcionar. Mas essa função não teria nenhuma utilidade, já que apenas retorna o próprio valor passado como argumento.

E toda você que você quiser retornar o valor, terá que passar esse valor como argumento.

O ideal é usar um método para atribuir valor e outro para retornar.

Se você quiser iniciar a classe com um valor, ou já definir um valor default, use um construtor.

Postado
No seu método, se você remover '= blnVisible' do parâmetro vai funcionar. Mas essa função não teria nenhuma utilidade, já que apenas retorna o próprio valor passado como argumento.

E toda você que você quiser retornar o valor, terá que passar esse valor como argumento.

O ideal é usar um método para atribuir valor e outro para retornar.

Se você quiser iniciar a classe com um valor, ou já definir um valor default, use um construtor.

desculpa, mas o meu objectivo é ter 2 ou mais variaveis dessa class, mas sem valores globais... ou seja alteras 1 valor da class da variavel 'a', mas a variavel 'b' nao pode ser alterada a partir da 'a'... quero evitar esses conflitos;)

  • 4 meses depois...
Postado

preciso de 1 dica sobre marcos;)

eu entendo que podemos fazer muitas cenas com macros;)

class test
{
private:
string name;
public:
void Name(string value)
{
name=value;
}
string Name()
{
return name;
}
};

esta class é 1 class como as outras. normal:

test a;
a.Name("Joaquim");

até aqui tudo bem. mas imagina usar 1 macro para fazer isto:

a.Name="Joaquim";

mas que funciona-se com class's para nao dar conflicos com argumentos;)

a minha macro actual esta errada:

#define x=y   x(y)

o que pensam da minha ideia?

  • 2 semanas depois...
Postado

finalmente ja tenho 1 codigo para propriedades:

#include <assert.h>
#include <iostream>
#include <typeinfo>
#include <string>


#define READ_ONLY 1
#define WRITE_ONLY 2
#define READ_WRITE 3


using namespace std;


template <typename Container, typename ValueType, int nPropType=3>
class property
{
public:
property()
{
m_cObject = NULL;
Set = NULL;
Get = NULL;
}


//-- This to set a pointer to the class that contain the
// property --








void setContainer(Container* cObject)
{
m_cObject = cObject;
}


//-- Set the set member function that will change the value --
void setter(void (Container::*pSet)(ValueType value))
{
if((nPropType == WRITE_ONLY) || (nPropType == READ_WRITE))
Set = pSet;
else
Set = NULL;
}


//-- Set the get member function that will retrieve the value --
void getter(ValueType (Container::*pGet)())
{
if((nPropType == READ_ONLY) || (nPropType == READ_WRITE))
Get = pGet;
else
Get = NULL;
}


//-- Overload the '=' sign to set the value using the set
// member --
ValueType operator =(const ValueType& value)
{
assert(m_cObject != NULL);
assert(Set != NULL);
(m_cObject->*Set)(value);
return value;
}




//-- To make possible to cast the property class to the
// internal type --
operator ValueType()
{
assert(m_cObject != NULL);
assert(Get != NULL);
return (m_cObject->*Get)();
}
friend istream &operator>>( istream &input, property &d )
{
ValueType v;
input >>v;
d = v;
return input;
}


friend istream& getline (istream& is, property& str)
{
ValueType v;
getline(is,v);
str = v;
return is;
}


private:
Container* m_cObject; //-- Pointer to the module that
// contains the property --
void (Container::*Set)(ValueType value);
//-- Pointer to set member function --
ValueType (Container::*Get)();
//-- Pointer to get member function --
};

eis como a uso:

#include <iostream>
#include "test.h"
#include <string>
#include <sstream>

using namespace std;

class PropTest
{
public:
PropTest()
{
//declaraçao das propriedades
Count.setContainer(this);
Count.setter(&PropTest::setCount);
Count.getter(&PropTest::getCount);
Name.setContainer(this);
Name.setter(&PropTest::setName);
Name.getter(&PropTest::getName);
}
int getCount()
{
return m_nCount;
}
void setCount(int nCount)
{
m_nCount = nCount;
}
property<PropTest,int,READ_WRITE> Count;

string getName()
{
return strName;
}
void setName(string sName)
{
strName = sName;

}
//declaraçao das propriedades
property<PropTest,string> Name;

private:
int m_nCount;
string strName;
};


PropTest a;

int main()
{

cout << "what is your name?\n";
getline(cin, a.Name) ;
cout <<"your name is: \t" <<(string)a.Name;
return 0;
}

mas preciso de fazer algumas alteraçoes:

eis como declaro a propriedade:

 PropTest()
{
//declaraçao das propriedades

Name.setContainer(this);
Name.setter(&PropTest::setName);
Name.getter(&PropTest::getName);
}
string getName()
{
return strName;
}
void setName(string sName)
{
strName = sName;

}
//declaraçao das propriedades
property<PropTest,string> Name;
private:
string strName;

eu queria juntar o destrutor com a declaraçao da variavel:

template <typename Container,typename getsub, typename setsub, typename ValueType, int nPropType=3>
class property
{
public:
property()
{
m_cObject = Container;//error:(
if((nPropType == WRITE_ONLY) || (nPropType == READ_WRITE))
Set = setsub;
else
Set = NULL;
if((nPropType == READ_ONLY) || (nPropType == READ_WRITE))
Get = getsub;
else
Get = NULL;
}


//-- This to set a pointer to the class that contain the
// property --
void setContainer(Container* cObject)
{
m_cObject = cObject;
}


//-- Set the set member function that will change the value --
void setter(void (Container::*pSet)(ValueType value))
{
if((nPropType == WRITE_ONLY) || (nPropType == READ_WRITE))
Set = pSet;
else
Set = NULL;
}


//-- Set the get member function that will retrieve the value --
void getter(ValueType (Container::*pGet)())
{
if((nPropType == READ_ONLY) || (nPropType == READ_WRITE))
Get = pGet;
else
Get = NULL;
}


//-- Overload the '=' sign to set the value using the set
// member --
ValueType operator =(const ValueType& value)
{
assert(m_cObject != NULL);
assert(Set != NULL);
(m_cObject->*Set)(value);
return value;
}




//-- To make possible to cast the property class to the
// internal type --
operator ValueType()
{
assert(m_cObject != NULL);
assert(Get != NULL);
return (m_cObject->*Get)();
}
friend istream &operator>>( istream &input, property &d )
{
ValueType v;
input >>v;
d = v;
return input;
}


friend istream& getline (istream& is, property& str)
{
ValueType v;
getline(is,v);
str = v;
return is;
}

private:
Container* m_cObject; //-- Pointer to the module that
// contains the property --
void (Container::*Set)(ValueType value);
//-- Pointer to set member function --
ValueType (Container::*Get)();
//-- Pointer to get member function --
};

por favor me digam o que estou a fazer mal no cabeçalho da template:(

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!