2010-09-05 47 views
3

J'ai des problèmes pour implémenter ma classe. Il devrait être capable de s'initialiser à partir de std :: string. J'ai donc écrit un constructeur de copie (?):Conversion de 'std :: string' en type non scalaire demandé

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"; 

Je reçois l'erreur suivante:

F:\Projekty\MCXJS\src\main.cpp|8|error: conversion from 'std::string' to non-scalar type 'MCXJS::CVariable' requested| 

Comment réparer ça?

JE CHERCHE UNE SOLUTION QUI PERMETTRA CHOSE EXACTEMENT comme suit:

MCXJS::CVariable s_var = (string)"good job"; 

Edit: ajout de (presque) 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| 
+0

Qu'est-ce que VARTYPE? – Alerty

+2

FYI: ce n'est pas un constructeur de copie. Un constructeur de copie crée un objet en tant que copie d'un autre objet * de la même classe *. –

Répondre

6

Vous devez prendre cela en const référence

CVariable (std::string const&, const int p_flags = 0); 

Cela n'a pas de sens d'accepter un résultat de conversion temporaire par une référence non-const. Les modifications apportées à ce paramètre seront simplement perdues par la suite. Le faire fonctionner en le faisant devenir une référence const est facile, donc Standard C++ l'interdit.

+3

Vous avez toujours une erreur. – Xirdus

+0

@Xirdus vous devez ajouter tous vos arguments par défaut dans l'en-tête, au lieu de dans le fichier .cpp ... –

+0

Cela aide. Merci. Maintenant, j'ai de nouvelles erreurs – Xirdus

0

Avez-vous omis d'ajouter la définition de la surcharge de l'opérateur '=' dans votre exemple de code? Vous devez définir correctement ce qui se passe lorsque vous affectez une chaîne à votre objet.

+0

non Xirdus

0

MCXJS::CVariable s_var = (string)"good job";

Est-ce une faute de frappe? Devrait être MCXJS::CVariable s_var = { 0, STRING, std::string("good job") }; ou même mieux, explicitement - MCXJS::CVariable s_var(std::string("good job"), 0);.