10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
1

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

14.10.2010, 13:56. Показов 2004. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2010, 13:56
Ответы с готовыми решениями:

Вопрос про конструктор
цитата исходного кода из книги: class stock{ ... public: stock(); //Типа объявление...

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

Вопрос про конструктор класса по умолчанию
http://s2.ipicture.ru/uploads/20111029/A7AtbNYV.jpg Пункт первый не могу немного понять.Т.е...

Конструктор копирования(быстрый вопрос)
Вроде бы все просто и логично, но в итоге выполнения B не копируется в A :C why? #include...

20
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
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);
Встречный вопрос: зачем в одном классе смешивать строки С со строками С++?
1
10 / 10 / 2
Регистрация: 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;
}
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
14.10.2010, 14:34 4
Цитата Сообщение от Krist_ALL Посмотреть сообщение
если я передаю в конструктор чар и в привате тоже чар то чтото не получается...
Если бы ты посмотрел внимательно, то ты бы увидел, что:
Цитата Сообщение от Nameless One Посмотреть сообщение
У std::string есть перегруженные конструкторы, котороые принимают const char* и const std::string&
Т.е. я говорил про std::string, а не про char. char - это тип языка Си, а не С++, у него конструкторов нет. Поэтому глупо пытаться инициализировать объект char объектом string.
1
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
14.10.2010, 14:47  [ТС] 5
непойму никак( хелп. нада чар в класс и стринг в класс
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
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;
}
1
10 / 10 / 2
Регистрация: 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] то какой тип аргумента писать констуткторе?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
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*
0
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
19.10.2010, 14:39  [ТС] 9
пишу в аргументе контсруктора char* name и норм пашет.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
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;
}
0
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
19.10.2010, 19:03  [ТС] 11
запустил и вывалилась ошибка. непойму из за чего)

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

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

и еще : вот мы записали в *name длинное слово без \0 и читает - мы можем прочитать намного боьше чем нужно cout кончает когда встретит \0 да?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
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 да?
не понял
0
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
19.10.2010, 21:13  [ТС] 13
ой как сложно)))
и все же я считаю что проще писать в аргументе char* просто без const далее name(name) и все
просто я обожаю краткую форму инициализации)


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

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

в прошлом твоем примере нет упоминания про CONST CHAR* везде просто char а ошиька всеж вылетает
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
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;
}
0
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
20.10.2010, 12:35  [ТС] 15
и как же поступать мне?
начал вникат в суть проблемы..

делать *name = "b"; ?
а если const char* name то одни ошибки
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
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 то одни ошибки
почитай лучше какую-нибудь хорошую книжку по Си/С++, реально поможет
0
10 / 10 / 2
Регистрация: 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 но длинну то как мы определим?
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
20.10.2010, 13:44 18
Krist_ALL, name - указатель на первый символ строки, разыменуя его мы получим первый символ. Вопрос: что ты хотел сказать присваивая символу строку "b"?

Не по теме:

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

0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
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
0
10 / 10 / 2
Регистрация: 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;
}
программа грохается
0
20.10.2010, 19:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.10.2010, 19:46
Помогаю со студенческими работами здесь

Про конструктор копирования, оператор присваивания
Объясните, пожалуйста, принцип действия конструктора копирования и операции присваивания. На что...

Инициализация массива через конструктор. Вопрос.
Всем привет. Есть скудная вытяжка из методички: &quot;Массив объектов В случае, когда возникает...

Вопрос про ф-ию mul
Расскажите пожалуйста про ф-ию mul, перегружаемую в классе. Что она делает?

Вопрос про память...
Вот скажите пожалуйста в чем разница между int *p = new int; *p = 10; и int n = 10; не...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru