la conversion de 'std::string" pour les non-scalaire du type requis
J'ai de la difficulté à la mise en œuvre de ma classe. Il devrait être en mesure d'initialiser à partir de std::string. J'ai donc écrit une copie (?) constructeur:
CVariable (std::string&, const int p_flags = 0);
Je suis en train de faire un objet de CVariable:
MCXJS::CVariable s_var = (string)"good job";
J'obtiens l'erreur suivante:
F:\Projekty\MCXJS\src\main.cpp|8|error: conversion from 'std::string' to non-scalar type 'MCXJS::CVariable' requested|
Comment résoudre ce problème?
JE SUIS À LA RECHERCHE DE SOLUTION QUI PERMETTRA À QUELQUE CHOSE EXACTEMENT COMME SUIT:
MCXJS::CVariable s_var = (string)"good job";
Edit: ajout de (presque) l'intégralité du code source:
cvariable.h
#ifndef CVARIABLE_H
#define CVARIABLE_H
#include <string>
#include <sstream>
namespace MCXJS
{
enum VARTYPE
{
STRING = 0,
INT = 1,
FLOAT = 2
};
class CVariable
{
public:
VARTYPE Type () {return m_type;};
std::string& Value () {return m_value;};
bool SetType (VARTYPE);
private:
const int m_flags;
VARTYPE m_type;
std::string m_value;
//ctors and operators
public:
CVariable (const int p_flags = 0);
CVariable (CVariable&, const int);
CVariable (std::string const&, const int);
CVariable (const int&, const int);
CVariable (const float&, const int);
CVariable& operator= (const CVariable&);
CVariable& operator= (const std::string&);
CVariable& operator= (const int);
CVariable& operator= (const float);
};
};
#endif //CVARIABLE_H
cvariable.cpp
#include "cvariable.h"
using namespace MCXJS;
using namespace std;
CVariable::CVariable (const int p_flags):
m_flags (p_flags)
{};
CVariable::CVariable (CVariable& p_var, const int p_flags = 0):
m_flags (p_flags),
m_type (p_var.Type()),
m_value (p_var.Value())
{};
CVariable::CVariable (std::string const& p_value, const int p_flags = 0):
m_flags (p_flags),
m_type (STRING),
m_value (p_value)
{};
CVariable::CVariable (const int p_value, const int p_flags = 0):
m_flags (p_flags),
m_type (INT)
{
std::ostringstream buffer;
buffer << p_value;
m_value = buffer.str();
};
CVariable::CVariable (const float p_value, const int p_flags = 0):
m_flags (p_flags),
m_type (FLOAT)
{
std::ostringstream buffer;
buffer << p_value;
m_value = buffer.str();
};
main.cpp
#include "cvariable.h"
#include <iostream>
using namespace std;
int main()
{
MCXJS::CVariable s_var = (string)"good job"; //error
cout << s_var.Value() << '\n';
return 0;
}
Edit: ajout d'enum VARPARAM
Edit: OK, résolu ci-dessus, maintenant j'ai ceci:
cvariable.cpp|12|error: passing 'const MCXJS::CVariable' as 'this' argument of 'MCXJS::VARTYPE MCXJS::CVariable::Type()' discards qualifiers|
cvariable.cpp|13|error: passing 'const MCXJS::CVariable' as 'this' argument of 'std::string& MCXJS::CVariable::Value()' discards qualifiers|
Qu'est-ce que VARTYPE?
FYI: ce n'est pas un constructeur de copie. Un constructeur de copie crée un objet comme une copie d'un autre objet de la même classe.
FYI: ce n'est pas un constructeur de copie. Un constructeur de copie crée un objet comme une copie d'un autre objet de la même classe.
OriginalL'auteur Xirdus | 2010-09-05
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de prendre cela en const référence
Il n'est pas logique d'accepter temporaire résultat de la transformation par un non-const de référence. Les modifications de ce paramètre va juste être perdu par la suite. Pour le faire fonctionner par avoir un const référence est facile, de sorte que la Norme C++, il suffit d'interdit.
vous devez ajouter tous vos arguments par défaut dans l'en-tête, au lieu de dans le .fichier cpp...
Cela aide. Merci. Maintenant, j'ai de nouvelles erreurs
Wow les downvotes sont juste divertissant. Si ma réponse ne serait qu'un flagrant deviner, je le comprends il y a downvotes sans justifications. Mais puisque je n'ai pas que deviner, mais a appliqué le raisonnement, je vais attendre la même chose pour downvote, des gens.
...alors quel est le problème avec mon consts?
OriginalL'auteur Johannes Schaub - litb
Avez-vous omis d'ajouter la définition de l'opérateur '=' la surcharge dans l'exemple de code? Vous avez besoin de bien définir ce qui se passe lorsque vous affectez une chaîne à votre objet.
OriginalL'auteur Alerty
Est-ce une faute de frappe? Devrait être
MCXJS::CVariable s_var = { 0, STRING, std::string("good job") };
ou encore mieux, de manière explicite -MCXJS::CVariable s_var(std::string("good job"), 0);
.OriginalL'auteur erjot