2010-11-18 27 views
4

est-ce possible:const à la non-const C++

changer une variable constante

non constante, je fais une classe nouvelle chaîne entière et mon constructeur ressemble à ce

LString(const char string1[]) {/* whatever I do */} 

Je ne mettrais pas le mot-clé const mais c'est la seule façon dont je peux obtenir des chaînes comme

LString ls = "a string"; 

Je veux l ont beaucoup de fonctions pour modifier cette chaîne

même si je fais une copie de cette chaîne, je ne peux toujours pas convertir const non const

est-il possible

sinon, peut-on penser à un échappatoire

ok si certaines personnes disent qu'il n'y a pas de problème, bien voici mon code

#include <iostream> 
#include <cstdlib> 
using namespace std; 
class LString 
{ 
public: 
LString(const char string1[]){ 
char s1[250] = {string1}; 
cout << "you constructed LString with a const string as a parameter"; 
} 

}; 

cela vient avec l'erreur suivante s

file.cpp: In constructor 'LString::LString(const char*)':

file.cpp:7:24: error: invalid conversion from 'const char*' to 'char'

si cela fait une différence que je utilise le compilateur MinGW sans IDE

Je compile par l'invite de commande

Je pense que c'est toutes les informations dont vous pourriez avoir besoin

Dites-moi si vous en avez besoin

+3

Je ne peux pas vraiment voir qui a mis un (-1) dans votre question, ce qui est trop mauvais et je suis désolé; Celui qui l'a fait a manqué le but de SO, qui est de permettre aux gens de poser des questions sur la programmation et, en ce qui me concerne, votre question convient parfaitement. –

+1

@Bruno: d'accord. +1 à cette question, c'est un bon. – Ashe

+1

Vous ne pouvez pas modifier un littéral de chaîne. Vous devez faire une copie ou repenser ce que vous essayez d'accomplir. – Blastfurnace

Répondre

4

Votre constructeur est bon - l'entrée doit être const.

La copie peut être non-const, pas de problème.

#include <string.h> 
class A { 
    public: 
    A(const char* string) 
    : a(strdup(string)) 
    {} 
    char* a; 
}; 

Ici j'utilise strdup pour faire une copie. Qu'est-ce que vous utilisez?

+2

Veuillez libérer() la chaîne copiée dans le destructeur ou utiliser std :: string. Sinon, cet exemple trop simplifié laisse échapper de la mémoire. – lothar

+1

Utilisez un membre 'std :: string const &' param et 'std :: string' et la gestion de la mémoire est faite pour vous. –

+1

@lothar vrai, mais j'essayais de résoudre le problème, pas de gestion de la mémoire. –

2

Je crois que le compilateur pense que vous essayez de changer la chaîne que vous attribuez. Comme il ne peut pas être changé, c'est pourquoi il se plaint. Avez-vous fait une copie de la chaîne pour apporter des modifications?

1

Je ne vois pas le problème. Conservez la signature du constructeur telle qu'elle est, mais faites la variable interne non-const et copiez-la. Copiez-le au début de la fonction, puis travaillez avec cette variable à la place.