1

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

Хай. Ну от тре мені хоч якось знати той C++, бо з одним C# відчуваю себе неповноцінним.
Зараз я хочу просто розібратись з класами.
Як описати, як створити екземпляр, як викликати методи.
Написав от таку фігню, буквально з голови взяв. Питання в коді

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

class MyClass
{
public:
    int a;
    int b;
    int c;
    MyClass(int a, int b, int c)
    {
        MyClass::a = a;
        MyClass::b = b;
        MyClass::c = c;
    }
    void firstMethod()
    {
        printf("%c%d", message, a + b + c);
    }
private:
    char* message = "Result: ";
};

void main()
{
    MyClass mc = new MyClass(1, 1, 1); // чого воно тут матюкається? як мені, наприклад, зробити масив з екземплярів класу?
    mc.firstMethod();
    _getch();
}

От, які матюки я отримую.  http://puu.sh/bCGT7/d18db99c29.png
Що я роблю не так?

2

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

от так робе

MyClass *mc = new MyClass(1, 1, 1);
    mc->firstMethod();

3 Востаннє редагувалося quez (17.09.2014 16:35:13)

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

Тому що оператор new

Allocates size bytes of storage, suitably aligned to represent any object of that size, and returns a non-null pointer to the first byte of this block.

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

4

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

FakiNyan написав:

Хай. Ну от тре мені хоч якось знати той C++, бо з одним C# відчуваю себе неповноцінним.

Удачі
В мене зворотня ситуація. Через півроку треба буде писати більш менш великий курсач на шарпі  :(

5 Востаннє редагувалося koala (17.09.2014 20:27:30)

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

десь так...
//#include <cstdlib>//вони тепер записуються так
//#include <cstdio>//це заголовки мови C. В C++ воно працює, але краще використовувати питомо C++сні заголовки:
#include <iostream>
#include <string>
//#include <conio.h> - цього робити не треба. Просто не треба, і все. Це заголовок для роботи з консоллю DOS, який 20 років як помер.
 
class MyClass
{
public:
    int a, b, c;//в один рядок
    MyClass( int _a, int _b, int _c )
      : a( _a ), b( _b ), c( _c ), //списки ініцалізації - це круто і швидко
        message( "Result: ")
    {
        
    }
    void firstMethod()
    {
        //printf("%c%d", message, a + b + c);//а краще std::cout
        std::cout << message << (a + b + c ) << std::endl;
    }
private:
    std::string message;//краще працюйте з рядками, якщо чомусь не треба саме з char[]
};
 
int main()//за стандартом має бути int
{
    MyClass *pmc = new MyClass( 1, 1, 1 ); // створення в купі через new
    MyClass mc( 2, 2, 2 );// створення локальної змінної
    mc.firstMethod();//виклик методу
    pmc->firstMethod();//виклик методу через вказівник
    delete pmc;//все, що ми виділяємо через new, має бути знищене через delete
    std::cout << "Press enter" << std::endl;
    std::cin.get();//а краще налаштувати компілятор, щоб він не закривав програму, а додавав цю саму паузу
}
Подякували: FakiNyan1

6

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

koala написав:
десь так...
//#include <cstdlib>//вони тепер записуються так
//#include <cstdio>//це заголовки мови C. В C++ воно працює, але краще використовувати питомо C++сні заголовки:
#include <iostream>
#include <string>
//#include <conio.h> - цього робити не треба. Просто не треба, і все. Це заголовок для роботи з консоллю DOS, який 20 років як помер.
 
class MyClass
{
public:
    int a, b, c;//в один рядок
    MyClass( int _a, int _b, int _c )
      : a( _a ), b( _b ), c( _c ), //списки ініцалізації - це круто і швидко
        message( "Result: ")
    {
        
    }
    void firstMethod()
    {
        //printf("%c%d", message, a + b + c);//а краще std::cout
        std::cout << message << (a + b + c ) << std::endl;
    }
private:
    std::string message;//краще працюйте з рядками, якщо чомусь не треба саме з char[]
};
 
int main()//за стандартом має бути int
{
    MyClass *pmc = new MyClass( 1, 1, 1 ); // створення в купі через new
    MyClass mc( 2, 2, 2 );// створення локальної змінної
    mc.firstMethod();//виклик методу
    pmc->firstMethod();//виклик методу через вказівник
    delete pmc;//все, що ми виділяємо через new, має бути знищене через delete
    std::cout << "Press enter" << std::endl;
    std::cin.get();//а краще налаштувати компілятор, щоб він не закривав програму, а додавав цю саму паузу
}

шо то за списки такі? яка різниця, чи я зроблю

a=_a;


чи

a=(_a);

7 Востаннє редагувалося koala (18.09.2014 06:22:16)

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

Подивіться уважніше - у мене немає знаків "=", і ініціалізація відбувається поза кодом. Для int-ів це дійсно не має значення, а от для класів це виглядатиме так:

недужебагатолітер
#include <iostream>

class Inner
{
  public:
  int x;
  Inner()
  {
    std::cout << "Inner (no params)" << std::endl;
  }
  Inner(int _x) : x(_x)
  {
    std::cout << "inner (param "<<x <<" )"<<std::endl;
  }
};
class Outer
{
  public:
  Inner i;
  Outer(Inner _i)
  {
    i = _i;
    std::cout << "Outer" << std::endl;
  }
};
class CorrectOuter
{
  public:
  Inner i;
  CorrectOuter(Inner _i) : i (_i)
  {
    std::cout << "CorrectOuter" << std::endl;  }
};
int main()
{
  Inner i(3);
  Outer o(i);
  CorrectOuter co(i);
}

подивитися, як це працює, можна тут: http://ideone.com/XmtR6l

вивід

inner (param 3 )
Inner (no params)
Outer
CorrectOuter

Як бачите, відбувається один зайвий виклик Inner (no params) - коли конструюється Outer, спершу створюється Inner без параметрів, а потім йому надається значення. У CorrectOuter такого немає.

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

8

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

koala написав:

Подивіться уважніше - у мене немає знаків "=", і ініціалізація відбувається поза кодом. Для int-ів це дійсно не має значення, а от для класів це виглядатиме так:

недужебагатолітер
#include <iostream>

class Inner
{
  public:
  int x;
  Inner()
  {
    std::cout << "Inner (no params)" << std::endl;
  }
  Inner(int _x) : x(_x)
  {
    std::cout << "inner (param "<<x <<" )"<<std::endl;
  }
};
class Outer
{
  public:
  Inner i;
  Outer(Inner _i)
  {
    i = _i;
    std::cout << "Outer" << std::endl;
  }
};
class CorrectOuter
{
  public:
  Inner i;
  CorrectOuter(Inner _i) : i (_i)
  {
    std::cout << "CorrectOuter" << std::endl;  }
};
int main()
{
  Inner i(3);
  Outer o(i);
  CorrectOuter co(i);
}

подивитися, як це працює, можна тут: http://ideone.com/XmtR6l

вивід

inner (param 3 )
Inner (no params)
Outer
CorrectOuter

Як бачите, відбувається один зайвий виклик Inner (no params) - коли конструюється Outer, спершу створюється Inner без параметрів, а потім йому надається значення. У CorrectOuter такого немає.

ааа! Я коли грався з кодом в ОПпості, то там теж була така фігня, коли воно мені казало, шо не мона створити клас, бо в нього немає пустого конструктору! Прийшлось пустий конструктор додавати.

9

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

А взагалі раджуся в C++ спершу погратися в імперативне/процедурне/модульне/АТД програмування (хоча б по парі завдань на кожне) до переходу на класи. Так, і ще треба тему з вказівниками ретельно проштудіювати - зокрема, з рядками.

10

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

koala написав:

А взагалі раджуся в C++ спершу погратися в імперативне/процедурне/модульне/АТД програмування (хоча б по парі завдань на кожне) до переходу на класи. Так, і ще треба тему з вказівниками ретельно проштудіювати - зокрема, з рядками.

то дайте мені завдань, а я їх нароблю цілу купу і стану гуру

11

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

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

А взагалі раджуся в C++ спершу погратися в імперативне/процедурне/модульне/АТД програмування (хоча б по парі завдань на кожне) до переходу на класи. Так, і ще треба тему з вказівниками ретельно проштудіювати - зокрема, з рядками.

то дайте мені завдань, а я їх нароблю цілу купу і стану гуру

//s - вказівник на початок рядка
void reverse_string(char* s){
    ...

Розвернути рядок - ніби й нескладне завдання, а не кожен може написати.

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

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

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

А взагалі раджуся в C++ спершу погратися в імперативне/процедурне/модульне/АТД програмування (хоча б по парі завдань на кожне) до переходу на класи. Так, і ще треба тему з вказівниками ретельно проштудіювати - зокрема, з рядками.

то дайте мені завдань, а я їх нароблю цілу купу і стану гуру

//s - вказівник на початок рядка
void reverse_string(char* s){
    ...

Розвернути рядок - ніби й нескладне завдання, а не кожен може написати.

типу swap? я просто запихну всі чари в якийсь контейнер, де є swap, а він є багато де
p.s. я пожартував

13

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

Хочете оволодіти тайнами роботи з рядками? Напишіть власну реалізацію бібліотеки cstring (тільки не намагайтеся шукати малюнки про ЦЕ!)

Подякували: quez, FakiNyan, 0x9111A3

14

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

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

то дайте мені завдань, а я їх нароблю цілу купу і стану гуру

//s - вказівник на початок рядка
void reverse_string(char* s){
    ...

Розвернути рядок - ніби й нескладне завдання, а не кожен може написати.

типу swap? я просто запихну всі чари в якийсь контейнер, де є swap, а він є багато де

А я напишу на Рубі взагалі:

s.reverse!

15

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

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

А взагалі раджуся в C++ спершу погратися в імперативне/процедурне/модульне/АТД програмування (хоча б по парі завдань на кожне) до переходу на класи. Так, і ще треба тему з вказівниками ретельно проштудіювати - зокрема, з рядками.

то дайте мені завдань, а я їх нароблю цілу купу і стану гуру

//s - вказівник на початок рядка
void reverse_string(char* s){
    ...

Розвернути рядок - ніби й нескладне завдання, а не кожен може написати.

ну ви і гад, а я тут думаю, в чому проблема

String literals are stored in read only section of memory.

16

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

koala написав:

Хочете оволодіти тайнами роботи з рядками? Напишіть власну реалізацію бібліотеки cstring (тільки не намагайтеся шукати малюнки про ЦЕ!)

я краще бутєр з'їм

17

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

quez написав:

А я напишу на Рубі взагалі:

s.reverse!

Так і на плюсах можна std::reverse зробити.

FakiNyan написав:

ну ви і гад, а я тут думаю, в чому проблема

String literals are stored in read only section of memory.

Не тільки і не стільки в цьому, але добре, що ви натрапили на цю пастку. Це тільки одна з них.

я краще бутєр з'їм

Краще за що - за написання чи за пошук?

18

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

koala написав:

Хочете оволодіти тайнами роботи з рядками? Напишіть власну реалізацію бібліотеки cstring (тільки не намагайтеся шукати малюнки про ЦЕ!)

:D  *THUMBSUP*

19

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

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

А я напишу на Рубі взагалі:

s.reverse!

Так і на плюсах можна std::reverse зробити.

FakiNyan написав:

ну ви і гад, а я тут думаю, в чому проблема

String literals are stored in read only section of memory.

Не тільки і не стільки в цьому, але добре, що ви натрапили на цю пастку. Це тільки одна з них.

я краще бутєр з'їм

Краще за що - за написання чи за пошук?

за оба

20

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

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