클래스 객체 생성을 할때

lkjt의 이미지

클래스 객체를 생성할때

classA a(24);

이렇게 생성하는데 만약에

classA a[4]

이렇게 배열로 생성하고 싶습니다.

이럴때 생성자는 어떻게 넘겨야 되는거죠??

cleol의 이미지

배열을 선언하면 각각의 원소에 대해 인자가 없는 생성자가 호풀되어 초기화됩니다. 인자가 있는 생성자는 사용할 수 없습니다.

lkjt의 이미지

그렇군요.

감사합니다.

dolsemix의 이미지

#include <iostream.h>

class A {
private:
	int a_;
public:
	A(int a) { a_ = a; };
	void out() { cout << a_ << endl; };
};

int main(int argc, char* argv[])
{
	printf("Hello World!\n");
	A a(24);
	a.out();

	A ar[] = { A(21), A(22), A(23), A(24) };
	for (int i = 0; i < 4; i++) {
		ar[i].out();
	}

	return 0;
}

담배 고만 펴야겠다...

lkjt의 이미지

감사합니다.

그런방법이 있엇군요.

lkjt의 이미지

그런데 루프에서 생성을 하고 싶을경우에는 어떻게 해야되죠?

dolsemix의 이미지

1. 인자없는 default 생성자를 선언합니다. (필수)
2. 초기값을 입력받는 멤버함수(ex. init)를 추가합니다.
3. cleol님이 말씀하신것처럼 배열을 선언합니다.
4. 루프에서 init(var list...)를 호출하여 초기화합니다.

생성자 중에 Copy Constructor라는 것을 이용하여 루프에서 생성하는 방법이 있긴 한데 오버헤드가 커서 별로 권하고 싶지 않습니다.
더좋은 방법은 생각이 안나네요.

담배 고만 펴야겠다...

dolsemix의 이미지

음.. 클래스 포인터 배열을 이용할 수도 있겠군요....

담배 고만 펴야겠다...

lkjt의 이미지

A[i].classA(3)

이렇게 하면 된다는 말이신가요?

이렇게 하면 컴파일 에러나던데요?

dolsemix의 이미지

적당한걸로 골라서 쓰세요~

// ConApp.cpp : Defines the entry point for the console application.
//

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

class A {
private:
	int a_;
public:
	A() { a_ = 0; };
	A(int a) { a_ = a; };
	init(int a) { a_ = a; };
	void out() { cout << a_ << endl; };
};

int main(int argc, char* argv[])
{
	printf("Hello World!\n");

	int i;
	A a(24);
	a.out();

	A ar[] = { A(21), A(22), A(23), A(24) };
	for (i = 0; i < 4; i++) {
		ar[i].out();
	}

	A ar2[4];
	for (i = 0; i < 4; i++) {
		ar2[i].init(i);
		ar2[i].out();
	}

	A* pa[4];
	for (i = 0; i < 4; i++) {
		pa[i] = new A(i); // using pointer class
		pa[i]->out();
	}

	return 0;
}

담배 고만 펴야겠다...

lkjt의 이미지

라이브러리 이니 4번이 적당한거 같네요

감사드립니다.

랜덤여신의 이미지

dolsemix wrote:
적당한걸로 골라서 쓰세요~

......

	A* pa[4];
	for (i = 0; i < 4; i++) {
		pa[i] = new A(i); // using pointer class
		pa[i]->out();
	}

	return 0;
}

......

delete pa[i];

도 써줘야 하지 않을까요?

lkjt의 이미지

당연히 써줘야 하죠.

그런데 프로세스 끝나면 OS가 알아서 죽여주지 않나요? (요즘)

alwaysN00b의 이미지

lkjt wrote:
당연히 써줘야 하죠.

그런데 프로세스 끝나면 OS가 알아서 죽여주지 않나요? (요즘)

http://bbs.kldp.org/viewtopic.php?t=33274

언제나 시작

sodomau의 이미지

  A ar[] = { A(21), A(22), A(23), A(24) };

이거 실제로 생성자가 8번이나 불리는 방식 아닌가요.
오버헤드를 생각한다면..;;

mastercho의 이미지

생성자에서 초기화 하지 않고

init()라는 함수를 두어서 초기화 하는 기법이 더 유용합니다

실제로 많은 책의 코드를 보면 생성자에서 하는 역활은

자기 멤버변수들을 0이나 NULL로 초기화하고

실제로는 init 같은 함수에서 인자를 받아 진짜 초기화를 합니다

승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스

sozu의 이미지

lkjt wrote:
당연히 써줘야 하죠.

그런데 프로세스 끝나면 OS가 알아서 죽여주지 않나요? (요즘)

프로세스가 데몬이라면 어떻게 하실것인지^^;;

매우 위험한 생각인것 같습니다.

-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com

akbar의 이미지

cdecl의 이미지

부가적인 메모리 할당이나 소멸자의 호출등의 작업을 해야하지만 디폴트 생성자가 없는경우에도 사용을 할수 있다는 장점이 있습니다.

#include <iostream>
using namespace std;


class BB
{
public:
    BB(int n) : n_(n) {};
    ~BB() {};
    
private:
    int n_;
};   


int main()
{
    enum { ARR_SIZE = 10 };
    

    void *pHeap = operator new(sizeof(BB) * ARR_SIZE);
    BB *pB = static_cast<BB*>(pHeap);
    for (int i = 0; i < ARR_SIZE; ++i) {
        new (pB + i) BB(i);
    }
    
    
    // ...
    
    
    // 명시적으로 소멸자 호출  
	for (int i = 0; i < ARR_SIZE; ++i) {
        pB[i].~BB();
    }
	operator delete(pHeap);    
}    

--
cdecl

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.