c++ 기본적인 질문 있습니다.

yeons의 이미지

아래와 같이 c++ 에서 똑같이 btAge 와 GetAge 함수에 접근할 수 있지만 방법은 다른데,

구조체를 중첩하는 것과
구조체를 상속 받아 사용 하는 것의 차이점이 있을까요?
각각 장단점이 있는지도 궁금합니다.

struct stEmployee
{
	BYTE btAge;
	std::string Name;
 
	BYTE GetAge() { return btAge; }
};
 
struct stSamSung
{
	int nID;
	stEmployee sCEO;
};
 
struct stNC : public stEmployee
{
	int nID;
};
 
void nFuntion()
{
	stSamSung sSamSung;
	sSamSung.sCEO.btAge = 5;
 
	printf("sSamSung.sCEO.btAge : %d\n", sSamSung.sCEO.GetAge());
 
	stNC sNC;
	sNC.btAge = 1;
 
	printf("stNC.btAge : %d\n", sNC.GetAge());
 
	system("PAUSE");
}
chanik의 이미지

중첩과 상속은, 구조체(클래스)로 모델링하고 있는 대상의 특성에 맞게 선택할 문제 아닐까요?

stSamsung과 stNC가 프로야구팀을 모델링하는 구조체라면 stEmployee를 상속하기보다는 중첩해서 쓰는 것이 적절하겠죠. sSamSung.sCEO.getAge() 를 보면서 삼성팀의 구단주 나이라고 직관적으로 파악할 수도 있고요. 만약 stSamsung 클래스에 btAge 멤버와 get함수를 추가한다면 sSamSung.sCEO.getAge()는 구단주 나이, sSamSung.getAge()는 구단의 연차가 될 수 있겠네요.

중첩이 어울릴 자리에 상속을 쓰거나 또는 그 반대로 할 경우, 어떻게든 목적은 이룰 수 있다고 해도, 코딩 과정이나 추후 코드 파악/관리에는 시간이 갈수록 큰 어려움이 생길 가능성이 클 것입니다.

swish95의 이미지

stSamsung 는 구조체의 멤버 변수로서 해당 구조체(stEmployee) 를 접근하고
stNC 는 상위 구조체(stEmployee) 를 접근하는 차이죠
사용하는 방식은 코드에 있듯이 다르게 접근해야 되죠

멤버 변수로 구조체를 사용하는걸 님은 중첩이라고 표현하셨지만 stSamsung 의 관점에서 봤을때는 int nID 와 다를게 없습니다.

요는 설계에 있습니다.
여러개의 구조체를 멤버 변수로 쓰거나 혹은 잘 조직된 구조체를 상속받아 쓰는 방식을 쓰는거죠

------------------------------------------------------------
ProgrammingHolic

Anti-Lock의 이미지

한편...
인간의 나이는 8비트 변수로 충분히 표현가능한가? 하는 생각이 스쳐갑니다.
인류 문명과 의료의 발달과 연관하여.. 수명연장. 냉동인간.....

익명 사용자의 이미지

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 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>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 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>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 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>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.