Форум программистов, компьютерный форум CyberForum.ru

Вопрос про конструктор и инициализвцию - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
14.10.2010, 13:56     Вопрос про конструктор и инициализвцию #1
C++
1
2
3
4
5
6
7
class test {
int a;
char name[10];
string name2;
public: test(int a,char* name,[B] ....[/B]) : a(a), [B].....[/B]{}
 
};
если стринг как параметр то что писать в прототипе?
и как быстро инициализировать чар и стринг? strcpy не хочу, мне нужен быстрый способ и как он кстати по нормальному называется?)

Добавлено через 2 часа 10 минут
upppppp
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2010, 13:56     Вопрос про конструктор и инициализвцию
Посмотрите здесь:

C++ Вопрос про outtextxy()
Вопрос про конструктор C++
C++ Вопрос про конструктор
Инициализация массива через конструктор. Вопрос. C++
Вопрос про конструктор класса по умолчанию C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
14.10.2010, 14:02     Вопрос про конструктор и инициализвцию #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class foo
{
 
public:
  foo(const char* str)
    : bar(str) {}
 
  foo(const std::string& str)
    : bar(str) {}
 
private:
   std::string bar;
};
Цитата Сообщение от Krist_ALL Посмотреть сообщение
и как быстро инициализировать чар и стринг?
У std::string есть перегруженные конструкторы, котороые принимают const char* и const std::string& :
C++
1
2
3
const char* mes = "message";
std::string foo(mes);
std::string bar(foo);
Встречный вопрос: зачем в одном классе смешивать строки С со строками С++?
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
14.10.2010, 14:29  [ТС]     Вопрос про конструктор и инициализвцию #3
если я передаю в конструктор чар и в привате тоже чар то чтото не получается...
C++
1
2
char na[10];
public: foo(const char* name): na(name) {}
error C2536: 'foo::na' : cannot specify explicit initializer for arrays


C++
1
2
string na[10];
public: foo(const std::string& name): na(name) {}
error C2536: 'foo::na' : cannot specify explicit initializer for arrays


C++
1
2
3
4
5
6
7
int main() {
 
char* a = "test";
foo lol(a);
 
return 0;
}
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
14.10.2010, 14:34     Вопрос про конструктор и инициализвцию #4
Цитата Сообщение от Krist_ALL Посмотреть сообщение
если я передаю в конструктор чар и в привате тоже чар то чтото не получается...
Если бы ты посмотрел внимательно, то ты бы увидел, что:
Цитата Сообщение от Nameless One Посмотреть сообщение
У std::string есть перегруженные конструкторы, котороые принимают const char* и const std::string&
Т.е. я говорил про std::string, а не про char. char - это тип языка Си, а не С++, у него конструкторов нет. Поэтому глупо пытаться инициализировать объект char объектом string.
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
14.10.2010, 14:47  [ТС]     Вопрос про конструктор и инициализвцию #5
непойму никак( хелп. нада чар в класс и стринг в класс
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
14.10.2010, 16:36     Вопрос про конструктор и инициализвцию #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
class foo
{
    const char* bar;
 
public:
    foo(const char* str)
        : bar(str) {}
 
    friend std::ostream& operator << (std::ostream& os, const foo& rhs)
    {
        os << rhs.bar;
        return os;
    }
};
 
int main()
{
    foo bar("foobar");
    std::cout << bar << std::endl;
    return 0;
}
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
19.10.2010, 13:28  [ТС]     Вопрос про конструктор и инициализвцию #7
почему во всех выше примерах const char* а не char*?
у меня прекрасно работает конструктор с аргуменотом без const...
а если писать const char* то и в приват зоне тоже нужно будет писать конст а может я захочу изменит потом переменную и не смогу(



C++
1
2
3
4
5
6
class stock {
char* name;
 public:    stock(  char* name) :name(name) {   }
    void show() { cout <<name;}
 
};
я не указал размер char* name- понятно что это указатель но куда пишутся данные? ведь указатель хранит адрес данных а не сами данные.
а если писать в пирвате char name[20] то какой тип аргумента писать констуткторе?
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
19.10.2010, 13:35     Вопрос про конструктор и инициализвцию #8
Цитата Сообщение от Krist_ALL Посмотреть сообщение
почему во всех выше примерах const char* а не char*?
у меня прекрасно работает конструктор с аргуменотом без const...
а если писать const char* то и в приват зоне тоже нужно будет писать конст а может я захочу изменит потом переменную и не смогу(
Если тебе нужно изменять, то тогда придется выделять память под строку либо статически, либо динамически, и делать копирование функцией strсpy
Цитата Сообщение от Krist_ALL Посмотреть сообщение
я не указал размер char* name- понятно что это указатель но куда пишутся данные? ведь указатель хранит адрес данных а не сами данные.
а если писать в пирвате char name[20] то какой тип аргумента писать констуткторе?
Я открою тебе секрет, но в таком коде
C++
1
2
3
const char* str1;
char* str2;
char str3[80];
и str1, и str2, и str3 - это указатели. Даже более того, можно сказать, что в С/С++ массивов нет!

Добавлено через 36 секунд
Цитата Сообщение от Nameless One Посмотреть сообщение
а если писать в пирвате char name[20] то какой тип аргумента писать констуткторе?
Все тот же const char*
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
19.10.2010, 14:39  [ТС]     Вопрос про конструктор и инициализвцию #9
пишу в аргументе контсруктора char* name и норм пашет.
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
19.10.2010, 15:18     Вопрос про конструктор и инициализвцию #10
Цитата Сообщение от Krist_ALL Посмотреть сообщение
пишу в аргументе контсруктора char* name и норм пашет.
а вот такая программа приводит к segmentation fault:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
 
class foo
{
public:
    foo ( char* str )
        : name ( str ) {}
 
    void bar()
    {
        *name = 'b';
    }
 
    void print()
    {
        std::cout << name << std::endl;
    }
 
private:
    char* name;
};
 
 
int main()
{
    foo f ( "alskdgl;bn;a lslvjl lsdhlvm l alj lmvalh ljm l" );
    f.print();
    f.bar();
    f.print();
    return 0;
}
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
19.10.2010, 19:03  [ТС]     Вопрос про конструктор и инициализвцию #11
запустил и вывалилась ошибка. непойму из за чего)

*name = 'b'; это допустимо вполне.
если можно разъясните плз.

заменил char* На стринг - все ок без ошибок.

и еще : вот мы записали в *name длинное слово без \0 и читает - мы можем прочитать намного боьше чем нужно cout кончает когда встретит \0 да?
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
19.10.2010, 19:55     Вопрос про конструктор и инициализвцию #12
Цитата Сообщение от Krist_ALL Посмотреть сообщение
*name = 'b'; это допустимо вполне.
Нет, так делать нельзя, потому что в данном случае name - это указатель на строковую константу (строковый литерал) "alskdgl;bn;a lslvjl lsdhlvm l alj lmvalh ljm l", которую, как известно, менять нельзя - происходит попытка произвести запись в область памяти, доступную только для чтения.

Чтобы такого не было, нужно, чтобы в name хранилась копия этой строки, для чего и нужно использовать функцию strcpy, предварительно выделив память под строку (статически - объявив name как "char name[число элементов];", либо динамически - объявив name как "char* name" и выделив ему в конструкторе память перед копированием с помощью оператора new)

Цитата Сообщение от Krist_ALL Посмотреть сообщение
заменил char* На стринг - все ок без ошибок.
естественно - там как раз работает вышеописанная схема (т.е. разработчики класса за тебя позаботились о выделении памяти и копировании строки)

Цитата Сообщение от Krist_ALL Посмотреть сообщение
и еще : вот мы записали в *name длинное слово без \0 и читает - мы можем прочитать намного боьше чем нужно cout кончает когда встретит \0 да?
не понял
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
19.10.2010, 21:13  [ТС]     Вопрос про конструктор и инициализвцию #13
ой как сложно)))
и все же я считаю что проще писать в аргументе char* просто без const далее name(name) и все
просто я обожаю краткую форму инициализации)


при char*name какой длинны я могу записывать данные? я делаю просто name(name) а про длинну хз.
конечно можно strncpy но мне всеж проще как я люблю.

ия почемуто немогу менять данные в name как мне присвоить новое значение name ?

в прошлом твоем примере нет упоминания про CONST CHAR* везде просто char а ошиька всеж вылетает
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
20.10.2010, 03:22     Вопрос про конструктор и инициализвцию #14
Цитата Сообщение от Krist_ALL Посмотреть сообщение
ой как сложно)))
и все же я считаю что проще писать в аргументе char* просто без const далее name(name) и все
просто я обожаю краткую форму инициализации)
Дело твое, только не жалуйся потом, что у тебя программы вылетают

Цитата Сообщение от Krist_ALL Посмотреть сообщение
конечно можно strncpy но мне всеж проще как я люблю.
ты еще скажи, что функцию strcpy написали зря и она никому не нужна

Цитата Сообщение от Krist_ALL Посмотреть сообщение
ия почемуто немогу менять данные в name как мне присвоить новое значение name ?
см. мой пост выше

Цитата Сообщение от Krist_ALL Посмотреть сообщение
в прошлом твоем примере нет упоминания про CONST CHAR* везде просто char а ошиька всеж вылетает
а там хоть char*, хоть const char* - все равно будет вылетать ошибка. Здесь главное не то, какой указатель, а то, каким значением оно инициализируется - строковым литералом (константой). Это будет равносильно такому участку программы:
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main ( void )
{
    // Здесь "Hello, World!" - строковая константа
    // str инициализируется адресом из области памяти, доступной только для чтения
    // Любая попытка записи в этой области приведет к ошибке сегментации
    char* str = "Hello, World!";
    str[3] = '%'; // Ошибка!
    return 0;
}
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
20.10.2010, 12:35  [ТС]     Вопрос про конструктор и инициализвцию #15
и как же поступать мне?
начал вникат в суть проблемы..

делать *name = "b"; ?
а если const char* name то одни ошибки
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
20.10.2010, 12:51     Вопрос про конструктор и инициализвцию #16
Цитата Сообщение от Krist_ALL Посмотреть сообщение
и как же поступать мне?
начал вникат в суть проблемы..
Вот так:
Цитата Сообщение от Nameless One Посмотреть сообщение
Чтобы такого не было, нужно, чтобы в name хранилась копия этой строки, для чего и нужно использовать функцию strcpy, предварительно выделив память под строку (статически - объявив name как "char name[число элементов];", либо динамически - объявив name как "char* name" и выделив ему в конструкторе память перед копированием с помощью оператора new)
Цитата Сообщение от Krist_ALL Посмотреть сообщение
делать *name = "b"; ?
а если const char* name то одни ошибки
почитай лучше какую-нибудь хорошую книжку по Си/С++, реально поможет
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
20.10.2010, 13:37  [ТС]     Вопрос про конструктор и инициализвцию #17
C++
1
2
3
4
public:  foo (const char* str ) { 
    strcpy(name,str);       }
...
 *name = "b"
cannot convert from 'char [2]' to 'char'
выделить память не понял как. знаю что через new но длинну то как мы определим?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.10.2010, 13:44     Вопрос про конструктор и инициализвцию #18
Krist_ALL, name - указатель на первый символ строки, разыменуя его мы получим первый символ. Вопрос: что ты хотел сказать присваивая символу строку "b"?

Не по теме:

Все таки почитай хоть какую нибудь книгу по СИ/С++.

Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
20.10.2010, 13:46     Вопрос про конструктор и инициализвцию #19
Цитата Сообщение от Krist_ALL Посмотреть сообщение
public: foo (const char* str ) {
strcpy(name,str); }
...
*name = "b"
cannot convert from 'char [2]' to 'char'
Krist_ALL, а ты знаешь, в чем разница между строкой и символом? "b" - это строка, а 'b' - это символ. О чем тебе компилятор и сообщил, только ты не понял
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <stdexcept>
#include <cstring>
 
class foo
{
public:
    foo ( const char * str )
    {
        if ( strlen ( str ) >= 10 )
            throw std::runtime_error ( "Error" );
        strcpy ( name, str );
    }
 
    void bar()
    {
        name[0] = 'b'; // Равносильно *name='b'
    }
 
    void print()
    {
        std::cout << name << std::endl;
    }
 
private:
 
    char name[10];
};
 
int main()
{
    foo f ( "test" );
    f.print();
    f.bar();
    f.print();
 
    return 0;
}
Цитата Сообщение от Krist_ALL Посмотреть сообщение
но длинну то как мы определим?
strlen
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2010, 19:46     Вопрос про конструктор и инициализвцию
Еще ссылки по теме:

Вопрос про табуляцию в C++ C++
Конструктор копирования(быстрый вопрос) C++
C++ Про конструктор копирования, оператор присваивания

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
20.10.2010, 19:46  [ТС]     Вопрос про конструктор и инициализвцию #20
так. осталось совсем чуть чуть чтобы закрыть совсем тему)


Nameless One, твой пример будет пахать даже если аргумент конструктора просто char* - непойму никак смысл const char*...(

быстая инициализация для char невозможна?


напиши плз код где в private char* и в констуркторе выделяется нужное колво памяти.

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <stdexcept>
#include <cstring>
 
class foo
{
public:
    foo ( const char * str )
    {
        //strcpy ( name, str );
        //strcpy(foo::name,name);
        char* name = new char[strlen(str)];
    }
 
    void bar()
    {
       // name[0] = 'b'; // ГђГ*ГўГ*îñèëüГ*Г® *name='b'
      // *name='b';
    }
 
    void print()
    {
        std::cout << name << std::endl;
    }
 
private:
 
  // char name[10];
    char *name;
};
 
int main()
{
    foo f ( "test" );
    f.print();
    f.bar();
    f.print();
 
    return 0;
}
программа грохается
Yandex
Объявления
20.10.2010, 19:46     Вопрос про конструктор и инициализвцию
Ответ Создать тему
Опции темы

Текущее время: 08:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru