이직하고 구조체에 대한 고민...

dhlee1985의 이미지

여태까지 구조체 멤버변수로 CString을 사용한 적이 없습니다.
구조체는 무조건 사용 전에 memset_s()와 같은 함수를 통해 초기화를 해야된다는게
프로그래밍 지론(?) 중 하나 였거든요.
문자열 쓸일이 있으면 CString 대신 TCHAR[]을 사용했습니다...
다행스럽게도 여태까지 거쳐간 회사들도 전부 구조체 안에서만큼은 CString을 사용안했구요...


근데 이번에 입사한 회사에서는 문자열 처리를 전부 CString을 하더군요.(구조체안에서도)
팀 인원이 꽤많아 이런 팀 규칙을 깨고 제 지론때문에 제가 수정하는 소스에서만 TCHAR[]을 사용했다가는
다들 피곤해 질꺼같아 저도 CString을 사용하려고 합니다.

지금 제가 고민 중인건
CString이 들어있는 구조체는 초기화&복사를 하기위해서 생성자와 대입연산자를 넣어야 할텐데
이건 그렇다 치더라도 구조체 안에 int,bool 값따위만 있는 구조체는 생성자,대입연산자를 만들기보다는
memset_s(),memcpy_s()을 사용하는게 더 나아보이는데

그랬다가는 구조체가
1. 생성자& 대입연산자가 있는 구조체
2. 생성자& 대입연산자가 없어서 mem~() 시리즈로 관리해야되는 구조체

두개로 나눠지게 되고 자칫 잘못했다가는 두개가 헷갈리기 시작할꺼같아서 지금 어떻게 해야될지 갈피를 못잡고 있습니다.. 지금 생각은 그냥 모든 구조체안에 생성자,대입연산자를 전부 만들 생각이거든요...

선배님들은 어떤 규칙으로 구조체를 관리하시는지 궁금합니다.

ktd2004의 이미지

c++을 사용하시면 c++ 방식을 사용하시는건 어떨까요?

klara의 이미지

C++의 구조체는 기본 접근 제한자가 public인 클래스일 뿐입니다.
전혀 클래스와 다르게 취급해야할 이유가 없습니다.
구조체를 특별히 취급해야하는 경우는 C 인터페이스와 소통해야할 경우 뿐입니다.

그리고 생성자야 초기값을 위해서 정의해준다고 해도, 대입연산자야 말로 CString이 들어있다면 전혀 신경쓸 필요가 없습니다.
기본 대입 연산자가 알아서 처리해줄테니까요.

yhsuk의 이미지

팀 규칙이 왜 그런지 물어보세요.

개인적으로는 memset_s 등으로만 초기화하는 것 보다는 생성자에서 초기화 해주는 게 더 좋다고 생각합니다.
생성자를 만드는 입장에서야 귀찮을 수도 있고, 변수를 하나씩 빼먹을 수도 있겠지만, 사용하는 입장이라면 memset_s도 호출해 줄 필요가 없지요.
초기화가 항상 null이나 0, false로 초기화 되지 않아야 할 수도 있습니다.

pthread_mutex_t theMutex;
pthread_mutex_init(&theMutex, NULL); or pthread_mutex_t result = PTHREAD_MUTEX_INITIALIZER;

그리고, 윗 분 얘기대로 CString처럼 복사 생성자와 대입 연산자들을 선언해서 deep copy가 가능한 클래스들로만 멤버변수가 구성되어 있으면,
따로 복사 생성자와 대입 연산자를 만들어 줄 필요가 없습니다.

생성자 만드는게 귀찮고, 혹시 초기화시 멤버변수를 하나 빼먹을까봐 그런 것이고, c++11과 호환되는 컴파일러로만 작업 가능한 환경이라면
생성자 말고 아래처럼 멤버변수 초기화도 바로 쓸 수 있으니, 이용해도 될지 물어 보세요.

class C
{
    int a=7; //C++11 only
  public:
    C();
};

Signature :) - "여유를 갖고 행동하되 게을러지지 말자"

dhlee1985의 이미지

그냥 기본대입연산자한테 모든 연산을 맡겨야겠네요
예전 이펙티브C++ 읽었을때 기본 대입연산자를 믿지말고 대입연산자는 무조건 정의하라고 해서
규칙을 따를려고했거든요

댓글 달기

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