[완료] 클래스안 구조체 참조선언

rasungboy의 이미지

안녕하세요.

보통 헤더가 꼬이는걸 방지하고자 헤더파일에는 사용하고자 하는 클래스/구조체의

참조선언만 해놓고 cpp 파일에 해당 클래스/구조체의 헤더파일을 include 해서 사용

하는데요.

예)
a.h
 
class B;
 
class A
{
   BOOL Create( B* p );
};
 
a.cpp
include "B.h"
BOOL A::Create( B* p )
{
....
}

클래스안에 선언된 클래스나 구조체의 경우는 어떻게 해야할지 난감하네요.

예
b.h
 
class B
{
  struct ST
  {
  };
};
 
a.h
class B;
struct B::ST;
 
class A
{
  BOOL Create( B::ST* p );
};

당연히 class B 를 모르니 struct B::ST; 자체에서 B 를 모른다고
컴파일러는 에러를 내죠.
a.h 에 B::ST 가 선언되있는 b.h 를 인클루드 하지 않고
컴파일에 성공할 방법은 없을까요?

mg2000의 이미지

구조체를 안에다 넣었다는 것은 A클래스 안에서만 사용하겠다는 것인데요.

다른 클래스에서 사용하실려면, 구조체를 클래스 밖으로 꺼내셔야죠.

rasungboy의 이미지

꼭 클래스안에 구조체를 선언했다고 해서

그 클래스 안에서만 사용 가능해야 하는건 아니라고 생각했는데요.

예를들어 관련된 기능들이 있는걸 하나의 클래스로 묶어서 그 클래스의

요소를 가져다 쓰는 개념으로 사용할려고 합니다.

제가 디자인 한것이 정녕 틀린 디자인인가요?

klyx의 이미지

인클루드 하는것 외에는 방법없습니다.
디자인이 잘못된건 아닙니다. 그보다 이런 단편적인 코드론 잘못된건지 아닌지 말하기도 뭐하죠.
이건 디자인에 대한 문제가 아닙니다. 컴파일러가 컴파일하는데 필요한게 갖춰줬느냐의 문제죠.
애시당초 B::ST라고 하고있는 순간에, 이미 B안에 있는 ST를 쓰겠다고 하는건데, 그럼 B안에 ST가 있다는걸 알고 있는거고, 그럼 B에 대한 선언이 포함되어야죠.
만약에 B가 클래스가 아니어도 상관없다면 namespace를 이용해보세요.

바라미의 이미지

이렇게 하면 안되나요?

[A.h]

class A {
  struct ST {
    ...
  }
}

[B.h]

#include "A.h"
 
class B {
  BOOL Create(A::ST* p);
}

[B.cpp]

#include "A.h"
 
BOOL B::Create(A::ST* p) {
  ...
}
klyx의 이미지

뭔가 질문을 잘못이해하신거 같네요.
질문하신분과 A,B가 반대로 코드를 작성하셨는데, 아무튼 작성하신대로 따르자면, B.h에서 "A.h"를 인클루드 하지 않고 A::ST를 이용할수 있냐는게 질문입니다.

바라미의 이미지

Quote:
참조선언만 해놓고 cpp 파일에 해당 클래스/구조체의 헤더파일을 include 해서 사용 하는데요.
클래스안에 선언된 클래스나 구조체의 경우는 어떻게 해야할지 난감하네요.

라고 해서.. 그저 클래스 내의 구조체 사용을 못하겠다 라고만 이해했어요.

인클루드 안하고는 못하니까. 인클루드를 해야한다는건 위의 어느분이 적으셨고..
저는 어떻게 해야 클래스 내의 구조제를 사용할 수 있는지만 코드로 적어놓은거고요..

그리고.. A,B가 반대로 된건 .. 댓글 쓰고 나서야 알아채서요.. -_-a

klyx의 이미지

질문 마지막에 다음과 같이 적혀있습니다.

Quote:
a.h 에 B::ST 가 선언되있는 b.h 를 인클루드 하지 않고
컴파일에 성공할 방법은 없을까요?

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.