멤버 함수
 
멤버 함수에 대한 포인터
기존에 멤버가 아닌 함수에 대한 포인터를 만들던 방식으로는 멤버 함수를 가리킬 수 없다. 멤버 함수에 대한 포인터를 만드는 문법은 조금 다르다.
typedef void (*fp)(int)   // 일반 함수에 대한 포인터
typedef void (Point::*fp)(int)   // 멤버 함수에 대한 포인터는 범위 지정자를 이용하여 어느 클래스의 멤버인지 지정 해야 한다.
* 정적 멤버 함수에 대한 포인터 : 정적 멤버 함수의 경우에는 멤버가 아닌 함수에 대한 포인터를 그대로 사용하면 된다.

 main.cpp
#include "Point.h"

// void XX() 형태의 함수에 대한 포인터
typedef void (*FP1)(int);

// void Point::XX() 형 태의 멤버 함수에 대한 포인터
typedef void (Point::*FP2)(int);

int main()
{
  // 객체 생성
  Point pt(5050);

//  FP1 fp1 = &Point::SetX;
  FP2 fp2 = &Point::SetX;

  // 함수 포인터를 사용해서 함수 호출
  (pt.*fp2)(100);

  // 내용 출력
  pt.Print();

  return 0;
}


 멤버 함수의 오버로딩
멤버 함수에서도 오버로딩이 가능하다. 시그니처만 다르게 하면 얼마든지 오버로딩 할 수 있다.

Point.h
#ifndef POINT_H
#define POINT_H

// Point 클래수를 정의한다
class Point
{
public:
  // 멤버 함수
  void Print();
  void Offset(int x_delta, int y_delta);
  void Offset(const Point& pt);

  // 생성자들
  Point();
  Point(int initialX, int initialY);
  Point(const Point& pt);

  // 접근자
  void SetX(int value);
  void SetY(int value);
  int GetX() const
  {
    return x;
  }
  int GetY() const
  {
    return y;
  }
private:
  // 멤버 변수
  int x, y;
};

#endif

Point.cpp
#include "Point.h"
#include <iostream>
using namespace std;

void Point::SetX(int value)
{
  if(value < 0)
  {
    x = 0;
  }
  else if(value > 100)
  {
    x = 100;
  }
  else
  {
    x = value;
  }
}

void Point::SetY(int value)
{
  if(value < 0)
  {
    y = 0;
  }
  else if(value > 100)
  {
    y = 100;
  }
  else
  {
    y = value;
  }
}

void Point::Offset(int x_delta, int y_delta)
{
  SetX(x + x_delta);
  SetY(y + y_delta);
}

void Point::Offset(const Point& pt)
{
  Offset(pt.x, pt.y);
}

Point::Point(const Point& pt)
{
  x = pt.x;
  y = pt.y;
}

Point::Point(int initialX, int initialY)
{
  SetX(initialX);
  SetY(initialY);
}

Point::Point()
{
  x = 0;
  y = 0;
}

void Point::Print()
{
  cout << "(" << x << ", " << y << ")\n";
}

 main.cpp
#include "Point.h"

int main()
{
  // 객체를 생성
  Point pt(5050);
  Point delta(100100);

  // 점을 x축으로 10, y축으로 -10만큼 이동시킨다.
  pt.Offset(10, -10);

  // 현재 점의 위치 출력
  pt.Print();

  // 점을 범위 밖으로 이동시킨다.
  pt.Offset(delta);

  // 현재 점의 위치 출력
  pt.Print();

  return 0;
}


   객체의 배열
클래스도 타입의 한 종류기 때문에 배열을 만들 수 있다. 구조체의 배열과 큰 차이점은 없지만 생성자와 관련된 문제를 생각해보아야 한다.

main.cpp
#include "Point.h"

int main()
{
  Point arr[3];

  for(int i = 0 ; i < 3 ; ++i)
    arr[i].Print();

  return 0;
}

// 객체의 배열을 선언 하면 각 객체들은 디폴트 생성자로 초기화 된다.

 main.cpp
#include "Point.h"

int main()
{
  Point arr[3= {
    Point(100100), Point(50100), Point(1010)
  };

  for(int i = 0 ; i < 3 ; ++i)
    arr[i].Print();

  return 0;
}

// 따로 생성자를 지정해서 초기화 할 수 있다.

   객체의 동적인 생성
객체를 동적으로 생성할 때도 new 연산자를 사용한다. 객체의 경우에는 생성자의 호출이라는 문제가 있기 때문에 기존에 new 연산자를 사용하던 방법하고는 조금 다르다.
겍체를 동적 할당 할 때 생성자는 new 연산자를 사용해서 동적으로 객체를 생성할 때 호출된다. 마찬가지로 소멸자는 delete 연산자를 사용해서 해제할 때 호출된다

 main.cpp
#include "Point.h"

int main()
{
  // 초기화용으로 객체를 만든다.
  Point pt(5050);

  // 동적으로 객체를 생성한다.
  Point *p1 = new Point();
  Point *p2 = new Point(100100);
  Point *p3 = new Point(pt);

  // 객체들의 내용을 출력한다.
  p1->Print();
  p2->Print();
  p3->Print();

  // 동 적으로 생성한 객체들을 정리한다.
  delete p1;
  delete p2;
  delete p3;
  p1 = p2 = p3 = 0;

  return 0;
}


// 정적 멤버 함수를 사용한 객체의 생성
#include <iostream>
#include <string>
using namespace std;

class Student
{
public:
  string name;  // 이름
  int sNo;    // 학번

  void Print();
private:
  // 생 성자
  Student(const string& name_arg, int stdNumber);

public:
  // 정 적 멤버
  static int studentNumber;
  static Student* CreateStudent(const string& name_arg);
};

int Student::studentNumber = 0;

Student* Student::CreateStudent(const string& name_arg)
{
  // 학생 객체를 생성한다
  Student *p = new Student(name_arg, studentNumber++);

  // 새로 생성된 학생 객체 반환
  return p;
}

Student::Student(const string& name_arg, int stdNumber)
{
  name = name_arg;
  sNo = stdNumber;
}

void Student::Print()
{
  cout << "{Name = " << name << ", std. Num. = " << sNo << "}\n";
}

int main()
{
  // 학생 객체를 세 개 생성한다.
  Student *p1, *p2, *p3;
  p1 = Student::CreateStudent(" 이계희");
  p2 = Student::CreateStudent("이춘훈");
  p3 = Student::CreateStudent("윤수연");

  // 생성 된 학생의 정보를 출력
  p1->Print();
  p2->Print();
  p3->Print();

  // 생성된 객체 해제
  delete p1;
  delete p2;
  delete p3;
  p1 = p2 = p3 = 0;

  return 0;
}


   PMC(Power Management Controller)
ARM 프로세서에서는 사용할 모듈에 각각 전력을 공급을 해주어야 한다. 이를 설정하는 레지스터로 PMC_PCER, PMC_PCDR, PMC_PCSR 등이 있다.

PMC_PCER : 각 비트를 Enable 하는데 사용한다.


PMC_PCDR : 각 비트를 Disable 하는데 사용한다.


PMC_PCSR : 각 비트의 상태를 확인한다.




   PIO(Parallel Input/Output Controller)
핀의 입출력을 제어하는 레지스터로 PIO_PER, PIO_PDR, PIO_PSR // PIO_OER, PIO_ODR, PIO_OSR // PIO_SODR, PIO_CODR, PIO_ODSR을 알아본다.

PIO_PER, PIO_PDR, PIO_PSR : 병렬 입출력 관련 설정
PIO_OER, PIO_ODR, PIO_OSR  : 출력 관련 설정
PIO_SODR, PIO_CODR, PIO_ODSR : 출력 데이터 설정
* AMR 프로세서에는 레지스터를 Set, Clear 시키는 레지스터가 각기 따로 존재 한다.

PIO_PER : 병력 입출력 허용


PIO_PDR : 병렬 입출력 금지


PIO_PSR : 병력 입출력 상태


PIO_OER : 출력 허용


PIO_ODR : 출력 금지


PIO_OSR : 출력 상태


PIO_SODR : 출력 데이터 허용


PIO_CODR : 출력 데이터 금지


PIO_ODSR : 출력 데이터 상태


+ Recent posts