La Conversion des données à partir d'un type de classe à un autre type de classe
J'ai essayé de convertir un type de classe de données à un autre type de classe donc j'étais en utilisant l'opérateur de coulée méthode dans mon oops programme en c++.
class example2;
class example1
{
int id;
int numbers;
int cost;
public:
example1(int a, int b, int c)
{
id=a;
numbers=b;
cost=c;
}
//getid() added here
//getnumber() added here
//getcost() added here
operator example2()
{
example2 temp;
temp.id=id;
temp.value=numbers*cost;
return temp;
}
};
class example2
{
int id;
int value;
public:
example2(int x,int y){
id=x;
value=y;
}
void display(){
cout<<"id "<<id<<endl;
cout<<"value "<<value<<endl;
}
};
quand j'ai été en utilisant la conversion de exemple1 à exemple2. Il montre l'erreur.
int main()
{
example1 s1(100,5,140.0);
example2 s2;
s2=s1;
s2.display();
return 0;
}
c'est de donner à l'erreur, mais pourquoi?. J'ai fait un opérateur de surcharger une fonction membre dans exemple1 classe parce que l'objet de exemple1 doit être changé en objet de exemple2.De sorte que cette fonction appelée à partir de la classe exemple1 de la méthode qui, je pense.Il doit être correct
D'erreur était:
erreur: le type de retour de la classe de exemple2 " est incomplète et
exemple2 temp; a incomplète de type
En quelque sorte, j'ai résolu d'une autre façon, j'ai ajouté un constructeur en exemple2 côté de classe:
example2(example1 e)
{
id=e.getid(); //these functions already added in my code i didnt mentioned them in here.
value=e.getnumber()*e.getcost();
}
et de faire des commentaires de 'l'opérateur exemple2 ()" dans exemple1.
maintenant, il est de travail.
Mais la manière n'était pas de l'accepter. Merci de m'aider à me corriger dans mon précédent façon de faire cette chose.
- Le message d'erreur vous indique que vous avez besoin de plus que juste une déclaration anticipée de
example2
au moment où vous avezexample1
dans le code. - Je ne vois pas un seul tenant n'importe où dans le programme.
- C'est la conversion d'un type classe de données à un autre type de classe de données.Je l'ai utilisé à partir de s2=s1.
- Je veux que ce problème est résolu à partir de seulement une classe à l'opérateur qui ne prend aucun paramètre et ne retourne rien
- Non, s2=s1 est juste l'attribution, en essayant de stuff s1 dans s2 et que peut ou mnay ne pas fonctionner selon les types de s2 et s1. Un casting change temporairement le type de données, vous permettant de traiter exemple2 comme un exemple1 et dans ce cas va dans le mur comme il n'y a pas de relation entre exemple2 et exemple1.
- s2=s1 est l'attribution, mais il est d'appeler une fonction membre "de l'opérateur exemple2() "parce que s1 est exemple1 objet et je suis de l'affecter dans exemple2 objet s2.qui est comme exemple2 s2=exemple2(s1); ou exemple2 s2=s1; ici, l'opérateur sera invoquée par s1
- Non, il n'est pas. s2=s1 est l'appel de l'opérateur=. Si vous voulez appeler votre fonte de surcharge, et vous ne le faites pas, il serait fait comme ceci:
(example2)s1
.
Vous devez vous connecter pour publier un commentaire.
L'une des classes doivent être définies en premier et le deuxième ne peut être utilisé qu'après qu'il est défini. Cela signifie que vous avez à briser les définitions de classe un peu.
Voici un exemple de la façon d'obtenir à la classe qui n'est pas encore défini, basé sur de l'OP post. L'explication vient sous la forme de commentaires incorporés dans le code pour avoir un code tout en un cut-n-pasteable morceau.
Maintenant pour la surcharge de l'opérateur de cast. C'est quelque chose que vous presque jamais envie de le faire parce qu'il y a presque toujours beaucoup plus de moyens évidents pour atteindre le même objectif.
Par exemple:
À ce point dans le temps dans le code la définition complète de
example2
doit être connu du compilateur parce que vous êtes la création d'une instance de cette classe appeléetemp
. Cependant vous n'avez que transmet la déclaration deexample2
à ce point dans le temps. Ainsi, alors que le compilateur sait queexample2
est un type en raison de l'transmet une déclaration qu'il n'a pas le plein d'informations sur la classe à ce point dans le temps donc il est incapable de fairetemp
. C'est de vous donner l'erreur que vous voyez.Si ce que vous voulez faire ici est d'être en mesure d'attribuer à
example2
s de types deexample1
s, vous devez créer un opérateur d'affectation pourexample2
qui prendexample1
s.Cependant ce qui me frappe comme une mauvaise conception, il y a probablement de meilleures façons d'obtenir ce que vous voulez qui implique une conception différente. Par exemple, une méthode qui a pour objet de prendre un
example1
comme un paramètre et modifier l'état serait beaucoup plus clair. Que serait tout simplement la construction d'une nouvelleexample2
de l'information dans laexample1
Vous devez utiliser le type de retour exemple2 ensuite, il sera
juste a bien fonctionné, permettez-moi de savoir si je suis absent quelque chose..
je pense que vous avez été absent sont:
définition de la classe exemple2 avant la classe exemple1
2.accéder aux données privées des membres de exemple2 à travers le retour par referece
3.constructeur vide dans la classe de destination exemple2