21

Re: Як створити екземпляр класу і як додати в нього конструктора?

Arete написав:

А як же заохочення? Написав алгоритм - з’їв бутер, не написав - сиди голодний. А то так і бутерів об’їсишся і нічого не знатимеш  :D

ви мені краще задачку підкиньте, а не жартами сипте

22

Re: Як створити екземпляр класу і як додати в нього конструктора?

Тоді напишіть свій std::string, теж непогане завдання.

23

Re: Як створити екземпляр класу і як додати в нього конструктора?

koala написав:

Тоді напишіть свій std::string, теж непогане завдання.

воно таке саме як і в c# ?

24

Re: Як створити екземпляр класу і як додати в нього конструктора?

По-перше, хіба в C# є std::string? По-друге, вам нема де подивитися? По-третє - та який завгодно клас для роботи з рядками, з відповідними функціями.

Подякували: FakiNyan1

25

Re: Як створити екземпляр класу і як додати в нього конструктора?

koala написав:

По-перше, хіба в C# є std::string? По-друге, вам нема де подивитися? По-третє - та який завгодно клас для роботи з рядками, з відповідними функціями.

с c# є просто стрінг, так якщо цей myString буде класом, то як мені його ініалізувати таким способом

myString s = "sdfsd";

дайте сказать. Перевизначення операції "=" ?

26

Re: Як створити екземпляр класу і як додати в нього конструктора?

FakiNyan написав:
myString s = "sdfsd";

дайте сказать. Перевизначення операції "=" ?

Не вгадали. Якщо ви створюєте змінну і одразу надаєте їй значення, то викликається конструктор з параметром, а не конструктор за замовчанням і потім operator =. Тобто

myString s = "asd";

еквівалентно

myString s("asd");

а якщо хочете викликати operator =, то треба писати

myString s;
s = "asd";
Подякували: quez, FakiNyan2

27

Re: Як створити екземпляр класу і як додати в нього конструктора?

Душевно я налайнокодив. Хтів зробити, аби можна було б додавати до строки новий шматочок за допомогою +, взнавати довжину та виводити в cout

Прихований текст
#include <cstdlib>
#include <iostream>
#include <cstdio>

class MyString
{
public:
    int length;
    char str[];
    MyString::MyString(char* str)
    {
        int length = sizeof(str);
        for (int i = 0; i < length; i++)
        {
            MyString::str[i] = str[i];
        }
        RecalcLength();
    }
    friend std::ostream& operator<<(std::ostream& os, const MyString& ms);

    void operator+=(char* str)
    {
        int length = sizeof(str);
        for (int i = 0; i < length; i++)
        {
            MyString::str[MyString::length+i] = str[i];
        }
        RecalcLength();
    }
private:
    void RecalcLength()
    {
        MyString::length = strlen(MyString::str);
    }
};

std::ostream& operator<<(std::ostream& os, const MyString& ms)
{
    os << ms.str;
    return os;
}

int main()
{
    MyString mys = "abc";
    std::cout << mys.length << std::endl;
    mys += "aaa";
    std::cout << mys.length << std::endl;
    std::cout << mys << std::endl;

    system("pause");
}

Виводить все вірно, але при закритті консольки вилазить ось це

Прихований текст

http://не-дійсний-домен/bEmvU/11a4cc3d46.png

28 Востаннє редагувалося Arete (18.09.2014 22:14:51)

Re: Як створити екземпляр класу і як додати в нього конструктора?

Подумай якого розміру в char str[] в класі, і скільки символів ти нього записуєш. Чи достатньо тобі масиву такого розміру?  :)
UPD. До того ж зверни увагу на фунцію sizeof...

Подякували: koala1

29

Re: Як створити екземпляр класу і як додати в нього конструктора?

Arete написав:

Подумай якого розміру в char str[] в класі, і скільки символів ти нього записуєш. Чи достатньо тобі масиву такого розміру?  :)
UPD. До того ж зверни увагу на фунцію sizeof...

я взагалі хз, який розмір того char[]. Я ж його ніде не зазначав.
Просто створив char[], а потім пихаю в нього все по індексам.
А нащо мені sizeof? воно наче показує розмір в байтах. Я ще так шукав довжину якогось там масиву, в іншій лабі.  Робив sizeof(arr)/sizeof(arr[0])

30

Re: Як створити екземпляр класу і як додати в нього конструктора?

Массив char[] розміру 0, якщо я не помиляюсь, тобто все що ви туди пишете виходить за межі масиву.
А sizeof визначає розмір типу аргументу, не аргументу, а саме його типу. Тобто sizeof(char *) рівно 8 у 64-бітній системі і рівно 4 в 32-бітній системі.

Подякували: FakiNyan, koala2

31 Востаннє редагувалося FakiNyan (18.09.2014 22:50:36)

Re: Як створити екземпляр класу і як додати в нього конструктора?

Arete написав:

Массив char[] розміру 0, якщо я не помиляюсь, тобто все що ви туди пишете виходить за межі масиву.
А sizeof визначає розмір типу аргументу, не аргументу, а саме його типу. Тобто sizeof(char *) рівно 8 у 64-бітній системі і рівно 4 в 32-бітній системі.

а, значить це був не char*, а char[]
p.s. а то нормально, що я виходжу за кордони масиву?

32

Re: Як створити екземпляр класу і як додати в нього конструктора?

Це зовсім ненормально, ви порушуєте ті дані які знаходяться за масивом - записуєте туди щось своє.

33

Re: Як створити екземпляр класу і як додати в нього конструктора?

Arete написав:

Це зовсім ненормально, ви порушуєте ті дані які знаходяться за масивом - записуєте туди щось своє.

А як же мені тоді зробити оту операцію + ? Робити якийсь масив довжиною 100000000000000000000000000?

34 Востаннє редагувалося koala (19.09.2014 06:20:21)

Re: Як створити екземпляр класу і як додати в нього конструктора?

Резервувати місце. Якщо не вистачає - додавати.

35

Re: Як створити екземпляр класу і як додати в нього конструктора?

koala написав:

Резервувати місце. Якщо не вистачає - додавати.

ммм. щось таке пам'ятаю, там ще використовувались якісь maloc caloc, чи якось так

36

Re: Як створити екземпляр класу і як додати в нього конструктора?

це функції с мови С
в плюсах - new і delete

Подякували: koala, FakiNyan2

37 Востаннє редагувалося quez (19.09.2014 12:54:01)

Re: Як створити екземпляр класу і як додати в нього конструктора?

FakiNyan написав:
koala написав:

Резервувати місце. Якщо не вистачає - додавати.

ммм. щось таке пам'ятаю, там ще використовувались якісь maloc caloc, чи якось так

Я запропонував би виділяти деяку кількість пам'яті з самого початку і слідкувати за кількістю елементів:

char c[INITIAL_SIZE];
int counter = 0;

Коли counter стане більшим за початковий розмір, створюємо новий масив, скажімо, в півтора рази більший, копіюємо туди початковий, а сам початковий масив вбиваємо.

malloc і calloc непотрібні.

38

Re: Як створити екземпляр класу і як додати в нього конструктора?

Розкажіть, як ви збираєтеся вбивати масив з фіксованим розміром.

39

Re: Як створити екземпляр класу і як додати в нього конструктора?

koala написав:

Розкажіть, як ви збираєтеся вбивати масив з фіксованим розміром.

Навіть не задумувався як, а що? Завжди є new/delete[].

40

Re: Як створити екземпляр класу і як додати в нього конструктора?

Так щоб delete щось, його треба спершу new. От

char *container = new char[ INITIAL_SIZE ];

можна delete-ати. Але не ваш масив.