конструктор по умолчанию
От: Bizz  
Дата: 19.05.06 12:27
Оценка:
Привет!
Застрял на конструкторе по умолч. Подскажите в чем проблема, плиз.
class Student {
    char* name;
    char* surname;
    char* middlename;
    bool married;
    bool children;
    bool flat;
    bool car;
    char* sex;
    
public:
    Student();
    ~Student();
    friend ostream& operator<<(ostream& out, Student& );
    friend istream& operator>>(istream& in, Student& );
    
};

Student::Student(void)
{        
    name=new char[2];
    strcpy(name, temp);
    surname=new char[2];
    strcpy(surname, "");
    middlename=new char[2];
    strcpy(middlename, "");
    sex="m";
    car=false;
    flat=false;
    children=false;
    married=false;
}

Student::~Student(void)
{
    delete []name;
    delete[]surname;
    delete []middlename;
}

Что-то не компилится, не догоню где я недоглядел.
Добавлена разметка — Кодт
Re: конструктор по умолчанию
От: LuciferMoscow Россия  
Дата: 19.05.06 12:35
Оценка:
Здравствуйте, Bizz, Вы писали:
Это
sex="m";
выглядит подозрительно.

Какие ошибки выдает(полный текст ошибки+номер строки)? Компилятор?
Re: конструктор по умолчанию
От: Аноним  
Дата: 19.05.06 12:36
Оценка:
B>Student::Student(void)
B>{
B> name=new char[2];
B> strcpy(name, temp); объявления вот этого не вижу
B> surname=new char[2];
B> strcpy(surname, ""); это можно заменить на *surname = '0';
B> middlename=new char[2];
B> strcpy(middlename, "");
B> sex="m";
B> car=false;
B> flat=false;
B> children=false;
B> married=false;
B>}

а что компилятор то говорит?
Re[2]: конструктор по умолчанию
От: Кирпа В.А. Украина  
Дата: 19.05.06 12:37
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>Здравствуйте, Bizz, Вы писали:

LM>Это
LM>sex="m";
LM>выглядит подозрительно.

LM>Какие ошибки выдает(полный текст ошибки+номер строки)? Компилятор?


Видать зачеты начались у студентов
!0xDEAD
Re: конструктор по умолчанию
От: Кодт Россия  
Дата: 19.05.06 12:38
Оценка:
Здравствуйте, Bizz, Вы писали:

B>Привет!

B>Застрял на конструкторе по умолч. Подскажите в чем проблема, плиз.
B>
B>class Student {
B>    char* name;
B>    char* surname;
B>    char* middlename;
B>    bool married;
B>    bool children;
B>    bool flat;
B>    bool car;
B>    char const* sex; // как я понимаю, он указывает на один из двух строковых литералов ("m", "f")
    // кстати, можно было обойтись одной буквой:
    char sex;
    
B>public:
B>    Student();
B>    ~Student();

B>    friend ostream& operator<<(ostream& out, Student const& );
    // вывод константного объекта - позволит делать приведение rvalue -> const lvalue

B>    friend istream& operator>>(istream& in, Student& );
B>};

B>Student::Student(void)
B>{        
B>    name=new char[2]; // ты уверен, что двух символов достаточно?
B>    strcpy(name, temp); // неизвестный идентификатор (или неполная цитата программы)

B>    surname=new char[2]; // здесь можно было выделить new char[1]
B>    strcpy(surname, ""); // и сделать surname[0]=0, хотя strcpy - читаемее.

B>    middlename=new char[2];
B>    strcpy(middlename, "");
B>    sex="m";
B>    car=false;
B>    flat=false;
B>    children=false;
B>    married=false;
B>}

B>Student::~Student(void)
B>{
B>    delete []name;
B>    delete[]surname;
B>    delete []middlename;
B>}
B>

B>Что-то не компилится, не догоню где я недоглядел.

Известно где недоглядел: в сообщениях компилятора. Обычно он достаточно ясно намекает на причину ошибки.
Перекуём баги на фичи!
Re: конструктор по умолчанию
От: DigitalGuru Россия http://svetlyak.ru
Дата: 19.05.06 12:38
Оценка:
Я бы переписал так:

#include <string>

class Student {
    std::string name;
    std::string surname;
    std::string middlename;
    bool married;
    bool children;
    bool flat;
    bool car;
    std::string sex;
    
public:
    Student();
    ~Student();
    friend ostream& operator<<(std::ostream& out, Student& );
    friend istream& operator>>(std::istream& in, Student& );
    
};

Student::Student(void)
    : sex( "m" )
    , car( false )
    , flat( false )
    , children( false )
    , married( false )

{        
}

Student::~Student(void)
{
}
Re[2]: конструктор по умолчанию
От: Bizz  
Дата: 19.05.06 12:45
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>Здравствуйте, Bizz, Вы писали:

LM>Это
LM>sex="m";
LM>выглядит подозрительно.

LM>Какие ошибки выдает(полный текст ошибки+номер строки)? Компилятор?


Вот еще вариант:
#include<iostream>
#include<ctime>
#include<stdlib.h>
#include<cstring>
using namespace std;

class Student {
    char* name;
    char* surname;
    char* middlename;
    bool married;
    bool children;
    bool flat;
    bool car;
    char* sex;//здесь указывает пол студента
    
public:
    Student();
    ~Student();
    friend ostream& operator<<(ostream& out, Student& );
    friend istream& operator>>(istream& in, Student& );
    //нужно дописать методы для ввода данных для студентов, для сложения студентов (вроде как поженить),
    //для вычитания студентов (развести с разделом имущества)
};


ostream& operator<<(ostream& out, Student& obj)
{
    out<<"name="<<obj.name;
    out<<"Surname="<<obj.surname;
    out<<"Middlename="<<obj.middlename;
    out<<"Married="<<obj.married;
    out<<"Flat="<<obj.flat;
    out<<"Car="<<obj.car;
    out<<"Children="<<obj.children;
    return out;
}

istream& operator>>(istream& in, Student& obj)
{
    cout<<"Name: ";
    in>>obj.name;
    cout<<"Surname: ";
    in>>obj.surname;
    cout<<"Middlename: ";
    in>>obj.middlename;
    cout<<"Married: ";
    in>>obj.married;
    cout<<"Flat: ";
    in>>obj.flat;
    cout<<"Car: ";
    in>>obj.car;
    cout<<"Any children: ";
    in>>obj.children;
    return in;
}

Student::Student(void)//вот еще вариант конструктора...
{        
    name=new char[2];
    strcpy(name, "");
    surname=new char[2];
    strcpy(surname, "");
    middlename=new char[2];
    strcpy(middlename, "");
    sex="m";//здесь указывает пол студента
    car=false;
    flat=false;
    children=false;
    married=false;
}

Student::~Student(void)
{
    delete []name;
    delete[]surname;
    delete []middlename;
}



void main()
{
    Student s;
    cout<<s.sex<<endl;
}


Сообщения компилятора:
_CRT_SECURE_NO_DEPRECATE. See online help for details.'
d:\docs\visual studio 2005\21предв\21.cpp(120) : error C2248: 'Student::sex' : cannot access private member declared in class 'Student'
        d:\docs\visual studio 2005\21предв\21.cpp(20) : see declaration of 'Student::sex'
        d:\docs\visual studio 2005\21предв\21.cpp(12) : see declaration of 'Student'
Build log was saved at "file://d:\Docs\Visual Studio 2005\21предв\Debug\BuildLog.htm"
21 - 1 error(s), 3 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


Добавлена разметка — Кодт
Re[2]: плохо переписал, НЕЗАЧОТ
От: cencio Украина http://ua-coder.blogspot.com
Дата: 19.05.06 12:46
Оценка: -2
плохо переписал, НЕЗАЧОТ,
если студентов так учить, то скоро с++ будет брать не меньше ресурсов чем дотнет.
для поля "пол" можно использовать энумератор, а не строку, и логичнее былобы для описания человека использовать клас Person, еще создать класс для описания адреса, и не валить все в одну кучу.
Re[2]: конструктор по умолчанию
От: Кирпа В.А. Украина  
Дата: 19.05.06 12:47
Оценка: :)
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Bizz, Вы писали:


BB>> char const* sex;

К> // кстати, можно было обойтись одной буквой:

А если "m" "f" "every day"
!0xDEAD
Re[2]: конструктор по умолчанию
От: Bizz  
Дата: 19.05.06 12:49
Оценка:
Спасибо, попробую этот вариант
Просто заморочился совсем, задача несложная. Там еще сложить студентов нужно(поженить), потом вычесть(развести с разделом имущества).
Горит на экзамен....
Re[3]: конструктор по умолчанию
От: LuciferMoscow Россия  
Дата: 19.05.06 12:50
Оценка: +1 :))) :)))
Здравствуйте, Bizz, Вы писали:
<skipped>
B> //нужно дописать методы для ввода данных для студентов, для сложения студентов (вроде как поженить),
B> //для вычитания студентов (развести с разделом имущества)
<skipped>
Re[3]: конструктор по умолчанию
От: Аноним  
Дата: 19.05.06 12:51
Оценка: :)
B>Сообщения компилятора:

B>_CRT_SECURE_NO_DEPRECATE. See online help for details.'

B>d:\docs\visual studio 2005\21предв\21.cpp(120) : error C2248: 'Student::sex' : cannot access private member declared in class 'Student'
B> d:\docs\visual studio 2005\21предв\21.cpp(20) : see declaration of 'Student::sex'
B> d:\docs\visual studio 2005\21предв\21.cpp(12) : see declaration of 'Student'
B>Build log was saved at "file://d:\Docs\Visual Studio 2005\21предв\Debug\BuildLog.htm"
B>21 — 1 error(s), 3 warning(s)
B>========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


Уже лучше. И которая из строк у нас с номером 120?
Re: конструктор по умолчанию
От: Bell Россия  
Дата: 19.05.06 12:52
Оценка:
Здравствуйте, Bizz, Вы писали:

Вам, уважаемый Bizz, двойка.



Конструктор по умолчанию не компилится из-за вот этой строчки:
strcpy(name, temp);

поскольку переменная temp — нигде не определена.
Вот пример, который компилируется:

class Student {
    char* name;
    char* surname;
    char* middlename;
    bool married;
    bool children;
    bool flat;
    bool car;
    char* sex;
    
public:
    Student();
    ~Student();
    friend ostream& operator<<(ostream& out, Student& );
    friend istream& operator>>(istream& in, Student& );
    
};

Student::Student(void)
{        
    name=new char[2];
    strcpy(name, temp);
    surname=new char[2];
    strcpy(surname, "");
    middlename=new char[2];
    strcpy(middlename, "");
    sex="m";
    car=false;
    flat=false;
    children=false;
    married=false;
}

Student::~Student(void)
{
    delete []name;
    delete[]surname;
    delete []middlename;
}


Но это ничего не значит, потому что работать не будет, и вот почему: реализация operator>> некорректа (я так понимаю, что начало этой историиздесь).

Ну откуда такая уверенность, что для любого имени хватит одного символа, место под который выделяется в конструкторе по умолчанию?
Кроме того, отсутствие конструктора копирования и оператора присваивания тянет за собой ошибку повторного удаления, т.е. все рухнет, как только в программе появятся копии объектов.

В общем так: если есть возможность, то вместо сырых указателей используй std::string. Если нет, то определяй коснтруктор копирования и оператор присваивания, и пиши operator>> примерно в таком духе:

std::istream& operator>>(std::istream& in, Student& s)
{
    char buff[64] = {0};
    std::cout<<"Name: ";
    in >> buff;
    delete [] s.name;
    s.name = new char[strlen(buff)+1];
    strcpy(s.name, buff);

    //...

    return in;
}
Любите книгу — источник знаний (с) М.Горький
Re[4]: конструктор по умолчанию
От: Кирпа В.А. Украина  
Дата: 19.05.06 12:55
Оценка: :)
Здравствуйте, LuciferMoscow, Вы писали:

LM>Здравствуйте, Bizz, Вы писали:

LM><skipped>
B>> //нужно дописать методы для ввода данных для студентов, для сложения студентов (вроде как поженить),
B>> //для вычитания студентов (развести с разделом имущества)
LM><skipped>
LM>

Да еще не забыть при сложении что однополые браки у нас запрещены (кинуть std::bad_cast если 2 гея хотят пожениться)

Интересно препод раньше наверное в отделе кадров сидел
Ничего другого не мог придумать

Предлагаю переехать с этим топиком в юмор
!0xDEAD
Re[3]: конструктор по умолчанию
От: Аноним  
Дата: 19.05.06 12:56
Оценка: :))) :))
Здравствуйте, Bizz, Вы писали:

B>Спасибо, попробую этот вариант

B>Просто заморочился совсем, задача несложная. Там еще сложить студентов нужно(поженить), потом вычесть(развести с разделом имущества).
B>Горит на экзамен....

Экзамен:
С : Я не подготовился
П : Почему?
С : Времени не было
П : Девки ?
С : нет
П : Вы меня разочаровываете
Re[3]: конструктор по умолчанию
От: Bizz  
Дата: 19.05.06 12:57
Оценка:
Я перекомпилил:

------ Build started: Project: 21, Configuration: Debug Win32 ------
Compiling...
21.cpp
d:\docs\visual studio 2005\21предв\21.cpp(61) : warning C4996: 'strcpy' was declared deprecated
c:\program files\microsoft visual studio 8\vc\include\string.h(73) : see declaration of 'strcpy'
Message: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
d:\docs\visual studio 2005\21предв\21.cpp(63) : warning C4996: 'strcpy' was declared deprecated
c:\program files\microsoft visual studio 8\vc\include\string.h(73) : see declaration of 'strcpy'
Message: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
d:\docs\visual studio 2005\21предв\21.cpp(65) : warning C4996: 'strcpy' was declared deprecated
c:\program files\microsoft visual studio 8\vc\include\string.h(73) : see declaration of 'strcpy'
Message: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
d:\docs\visual studio 2005\21предв\21.cpp(84) : error C2248: 'Student::sex' : cannot access private member declared in class 'Student'
d:\docs\visual studio 2005\21предв\21.cpp(15) : see declaration of 'Student::sex'
d:\docs\visual studio 2005\21предв\21.cpp(7) : see declaration of 'Student'
Build log was saved at "file://d:\Docs\Visual Studio 2005\21предв\Debug\BuildLog.htm"
21 — 1 error(s), 3 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Re[2]: конструктор по умолчанию
От: Bell Россия  
Дата: 19.05.06 12:58
Оценка:
Здравствуйте, Bell, Вы писали:

B>Вот пример, который компилируется:

Сорри, не тот этьо был пример


class Student {
    char* name;
    char* surname;
    char* middlename;
    bool married;
    bool children;
    bool flat;
    bool car;
    char* sex;
    
public:
    Student();
    ~Student();
    friend std::ostream& operator<<(std::ostream& out, Student& );
    friend std::istream& operator>>(std::istream& in, Student& );
    
};
//22
Student::Student(void)
{        
    name=new char[2];
    strcpy(name, "");
    surname=new char[2];
    strcpy(surname, "");
    middlename=new char[2];
    strcpy(middlename, "");
    sex="m";
    car=false;
    flat=false;
    children=false;
    married=false;
}

Student::~Student(void)
{
    delete []name;
    delete[]surname;
    delete []middlename;
}
Любите книгу — источник знаний (с) М.Горький
Re[4]: конструктор по умолчанию
От: Аноним  
Дата: 19.05.06 13:04
Оценка: :)
Здравствуйте, Bizz, Вы писали:

B>Я перекомпилил:


B>------ Build started: Project: 21, Configuration: Debug Win32 ------

B>Compiling...
B>21.cpp
B>d:\docs\visual studio 2005\21предв\21.cpp(61) : warning C4996: 'strcpy' was declared deprecated
B> c:\program files\microsoft visual studio 8\vc\include\string.h(73) : see declaration of 'strcpy'
B> Message: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
B>d:\docs\visual studio 2005\21предв\21.cpp(63) : warning C4996: 'strcpy' was declared deprecated
B> c:\program files\microsoft visual studio 8\vc\include\string.h(73) : see declaration of 'strcpy'
B> Message: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
B>d:\docs\visual studio 2005\21предв\21.cpp(65) : warning C4996: 'strcpy' was declared deprecated
B> c:\program files\microsoft visual studio 8\vc\include\string.h(73) : see declaration of 'strcpy'
B> Message: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
B>d:\docs\visual studio 2005\21предв\21.cpp(84) : error C2248: 'Student::sex' : cannot access private member declared in class 'Student'
B> d:\docs\visual studio 2005\21предв\21.cpp(15) : see declaration of 'Student::sex'
B> d:\docs\visual studio 2005\21предв\21.cpp(7) : see declaration of 'Student'
B>Build log was saved at "file://d:\Docs\Visual Studio 2005\21предв\Debug\BuildLog.htm"
B>21 — 1 error(s), 3 warning(s)
B>========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


Блин кончай людям мозги морочить
написано

d:\docs\visual studio 2005\21предв\21.cpp(84) : error C2248: 'Student::sex' : cannot access private member declared in class 'Student'

покажи, блин, строку 84 файла 21.cpp

Телепатоф здесь нет чтобы угадывать где у тебя ошибка
Re[2]: конструктор по умолчанию
От: Ubivetz Украина  
Дата: 19.05.06 13:07
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Bizz, Вы писали:


B>Вам, уважаемый Bizz, двойка.

B>


B>поскольку переменная temp — нигде не определена.

B>Вот пример, который компилируется:

B>
B>class Student {
B>    char* name;
B>    char* surname;
B>    char* middlename;
B>    bool married;
B>    bool children;
B>    bool flat;
B>    bool car;
B>    char* sex;
    
B>public:
B>    Student();
B>    ~Student();
B>    friend ostream& operator<<(ostream& out, Student& );
B>    friend istream& operator>>(istream& in, Student& );
    
B>};

B>Student::Student(void)
B>{        
B>    name=new char[2];
B>    strcpy(name, temp);
B>    surname=new char[2];
B>    strcpy(surname, "");
B>    middlename=new char[2];
B>    strcpy(middlename, "");
B>    sex="m";
B>    car=false;
B>    flat=false;
B>    children=false;
B>    married=false;
B>}
А Вот Вы Bell, тоже забыли объявить переменную temp.

И вместо 
[ccode]
  name = new char[2];
  strcpy (name, ""); 
  // Или
  strcpy (name, "");

лучше писать
  name = strdup( "" );

А лучше так
std::string name;
// Или так 
CString name;
....
name = "Bizz";
...
Эх, люблю выпить и переспать с кем нибудь!
Но чаще выходит перепить с кем — нибудь и выспаться...
Re[5]: конструктор по умолчанию
От: Bizz  
Дата: 19.05.06 13:07
Оценка:
84 строка :

cout<<s.sex<<endl;
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.