for Robot Artificial Inteligence

12. Class

|

Class

  • Class는 파이썬과 마찬가지로 프로젝트를 함에 있어 알고리즘을 나누는 역할을 한다.
  • 예로 어떤 클래스는 더하기를, 어떤 클래스를 곱하기를 역할을 나눠주고 Main Class에다가 합쳐 Main클래스를 간결하게 해준다.

Exercise 1

Main.cpp

#include <iostream>
#include "people.h"
using namespace std;
/* classes */

void test()
{
    PersonalData *pointer = new PersonalData[5];

    delete []pointer;
}

int main()
{

    PersonalData person(20);
    PersonalData person2(50);

    cout << person.getAge()<< endl;
    cout << person2.getAge() << endl;


   // test();
    return 0;
}


people.h

#ifndef PEOPLE_H_INCLUDED
#define PEOPLE_H_INCLUDED

class PersonalData
{
    private:
        short age; // the first argument taken
        int *p;
    public:
        PersonalData(); // 인수가 없으면 이 클래스로 가고 있으면 아래 클래스로 간다.
        PersonalData(short);
        ~PersonalData();
        /**
            This function is setting age. If age is lower than 0, then age = 10.
        */
        void setAge(int);
        short getAge() {return age;}
};

#endif // PEOPLE_H_INCLUDED

people.cpp

#include "people.h"
#include <iostream>

using namespace std;
void PersonalData::setAge(int age)
{
    if (age < 0)
        this->age = 0;
    else
        this->age = age;
}
PersonalData::PersonalData()
{
    static int i = 0;
    cout << "Constructor has been just invoked " << ++i << endl;
    age = 10;

    p = new int[5];
}
PersonalData::PersonalData(short age)
{
    cout <<"this is diff cons" << endl;
    this->age = age;
}
PersonalData::~PersonalData()
{
    static int j = 0;
    cout << "Destructor has been just invoked " << ++j << endl;

    delete [] p;
}

  • Result

Exercise 2

Main.cpp

#include <iostream>
#include "position.h"

using namespace std;

int main()
{
    Position dog(10, 50);

    dog.getPosition();
    dog.setPosition(50, 100);
    dog.getPosition();

    const Position house(100, 200);

    house.getPosition();
//    house.setPosition(444, 444);
    //house.getPosition();

    return 0;
}

Position.h

#ifndef POSITION_H_INCLUDED
#define POSITION_H_INCLUDED

class Position
{
    int x, y;
    public:
        Position(int,int);
        ~Position();
        void getPosition() const;
        void setPosition(int, int);
};

#endif // POSITION_H_INCLUDED

position.cpp

#include "position.h"
#include <iostream>

using namespace std;

Position::Position(int x, int y)
{
    this->x = x;
    this->y = y;
}
Position::~Position()
{

}

void Position::getPosition() const
{
    cout << "x : " << x << endl;
    cout << "y : " << y << endl;
}

void Position::setPosition(int x, int y)
{
    this->x = x;
    this->y = y;
}

(operator)[http://algamza.blogspot.com/2016/03/c-operator-overloading.html]

  • 사용자 정의 클래스 를 사용할 때 연산자에 특별한 의미를 부여할 수 있다는 점은 C++의 멋진 기능 중 하나입니다.
  • 이 기능을 연산자 오버로딩(operator overloading) 이라고 합니다. C++의 연산자 오버로딩은 클래스에 특별 멤버 함수를 다음과 같은 명명 규칙에 따라서 작성해 구현할 수 있습니다.

    Operator 종류

    • = (할당 연산자, assignment operator)
          • (이진 산술 연산자, binary arithmetic operators)
    • += -= = (복합 할당 연산자, compound assignment operators)
    • == != (비교 연산자, comparison operators)

예제

class MyClass {
  public:
  ...
  MyClass & operator=(const MyClass &rhs);
  ...
}

MyClass a, b;
...
b = a;   // b.operator=(a); 와 동일함
MyClass& MyClass::operator=(const MyClass &rhs) {
    // 자기 할당을 확인합니다.
    if (this == &rhs)      // 동일 객체?
        return *this;        // 맞네요. 그럼 할당을 건너뛰고 *this를 반환합니다.

    ... // 할당 해제, 새 공간을 할당하고 값을 복사합니다...

    return *this;
}

Example 3

main.cpp

#include <iostream>
#include "integer.h"

using namespace std;
/* CONVERT constructor - overloading operators */
int main()
{
    Integer a(50);

    int b = a;
    a = 100;
    cout << a.getNr() << endl; //100
    cout << b << endl; // 50

    cout << a + b << endl; //150

    b += a; // a = a + b;

    cout << b << endl; // 150

    cout << a << endl; // 100

    return 0;
}

interger.h

#ifndef INTEGER_H_INCLUDED
#define INTEGER_H_INCLUDED

class Integer
{
    int nr;
    public:
        Integer() { };
        Integer(int);
        operator int();
        int operator+=(Integer);
        int getNr() { return nr; };
};


#endif // INTEGER_H_INCLUDED

interger.cpp

#include "integer.h"
#include <iostream>

using namespace std;
Integer::Integer(int nr)
{
    this->nr = nr;
}
Integer::operator int()
{
    return this->nr;
}
int Integer::operator+=(Integer o)
{
    this->nr = o.getNr() + this->nr; //this는 오퍼레이터에서 받아지는 인수값이다. 그리고 o 는 그 뒤에 받아지는 값
    return this->nr; // 여로 들면 a+=b라고 했을떄 a값이 this이고 b값이 integer o라고 보면 된다.
}

Comments