2010-11-18 2 views
4

это возможно:сопзЬ к неконстантных C++

изменения постоянной переменной в непостоянной

творю целая новая строка класса и мой конструктор выглядит так

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

Я бы не поставил ключевое слово const, но это единственный способ получить строки, такие как

LString ls = "a string"; 

I wil л имеют много функций, чтобы изменить эту строку

хотя я сделать копию этой строки, я до сих пор не могу преобразовать сопзЬ к не сопзИте

возможно

если нет, то может кто-нибудь думать о лазейку

ИТАК некоторые люди говорили, что нет никаких проблем, а вот мой код

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

}; 

это приходит со следующей ошибкой s

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

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

, если это делает разницу я использую MinGW компилятор без IDE

Я составителя через командную строку

Я думаю, вот и все данные, которые вы, возможно, потребуется

скажите мне, если вам нужно больше

+3

Я не могу понять, кто положил (-1) в ваш вопрос, что слишком плохо, и я сожалею; Кто бы это ни пропустил, то, что нужно, чтобы люди задавали вопросы о программировании, и, насколько мне известно, ваш вопрос подходит идеально. –

+1

@Bruno: согласен. +1 к этому вопросу, это хорошо. – Ashe

+1

Вы не можете изменить строковый литерал. Вам нужно сделать копию или переосмыслить то, что вы пытаетесь выполнить. – Blastfurnace

ответ

4

Ваш конструктор в порядке - вход должен быть const.

Копия может быть неконстантной, без проблем.

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

Здесь я использую strdup, чтобы сделать копию. Что вы используете?

+2

Пожалуйста, освободите() скопированную строку в деструкторе или используйте std :: string. В противном случае этот упрощённый пример утечки памяти. – lothar

+1

Используйте параметр 'std :: string const &' param и 'std :: string', и управление памятью выполняется для вас. –

+1

@lothar true, но я пытался решить проблему, а не управление памятью. –

2

Я считаю, что компилятор думает, что вы пытаетесь изменить строку, которую вы назначаете. Поскольку он не может быть изменен, поэтому он жалуется. Вы сделали копию строки, чтобы внести изменения?

1

Я не вижу проблемы. Сохраните подпись конструктора, как она есть, но сделайте внутреннюю переменную неконстантной и скопируйте ее. Скопируйте его в начале func, а затем используйте эту переменную.

Смежные вопросы