[완료]C++에서 new[]로 객체 배열 생성시, 생성자 호출 방법

klara의 이미지

맨날 눈팅만 하다가 처음으로 글 올려보는데, 그게 질문글이라 아쉽습니다-_-;

각설하고...

new 연산자를 이용하는 경우는 new Class(...) 이런식으로 생성자를 호출할수 있는데요, new[]를 이용하여 객체배열을 만들때는 어떻게 생성자를 호출해야 하나요...?

대충 때려잡는 다고 new Class(..)[4], new (Class(..))[4], new Class[4](...) 등을 시도해봤는데 다 틀린듯하네요...

웹에서 new 배열 생성자 이렇게 검색하면 나오는건 자바스크립트의 Array생성하는 법뿐 orz

아시는분, 알려주시면 감사하겠습니다.

philnet의 이미지

초기화를 가능하게 할 syntax가 없었다는 글을 본 것으로 기억합니다. (google에서 "initialization in array new"로 검색하시면 보실 수 있을 듯)

따라서 array대신 vector의 범위 지정 생성자를 사용하시는 게 바람직 할 것으로 보입니다. (굳이 array를 사용해야 한다면, 해당 class에 기본 생성자를 제공해서 사용해야 할 것 같네요)

아래는 vector의 범위 지정 생성자를 사용해서 초기값을 20으로 한 Test를 5개 만들어서 vector를 만드는 예입니다.

class Test
{
public:
  Test(int a_value) : m_value(a_value) { cout << m_value << endl; }
  ~Test() {}
private:
  int m_value;
};
 
vector<Test>* CreateTests()
{
  retern new vector<Test>(5, 20);
}
 
int main()
{
  vector<Test>* vtests = CreateTests();
  // using vtests;
  delete vtests;
  return 0;
}
klara의 이미지

마땅히 뾰족한 방법은 없는 것이로군요.
가변배열도 아니니, 말씀하신대로 그냥 처음에 벡터에 크기 지정해주고 초기화해서 사용해야겠습니다.
답변 감사합니다.

cronex의 이미지

어느 클래스를 배열로 만드셨는지 모르겠으나...

string *str_array = new string[20];

는 정상적으로 사용하고 있습니다.

직접 만드신 클래스라면 아마 배열을 하기 위한 조건같은게 필요할지도 모르겠습니다.
(기본 생성자가 있어야 한다거나... 하는...)

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

klara의 이미지

그렇게 하면 기본 생성자가 자동으로 호출되는건데, 전 따로 생성자로 인자를 전해주고 싶거든요.

string이야 생성후에 얼마든지 값을 바꿀수 있지만, 꼭 생성할때 값을 줘야 하는 클래스가 있잖아요?

이런 클래스의 객체에 동적할당할때는, 생성자를 호출해줘야하는데, 배열로 생성하는 경우는 어떻게 하나...하는 문제였습니다.

신경써주셔서 감사합니다.

익명사용자의 이미지

템플릿을 쓰면 쉽게 해결됩니다.
템플릿 인자에 object constructor가 호출될때 사용할 값을 넣으면 됩니다.
단 클래스가 약간 보기 싫은건 감수해야죠.

klara의 이미지

TempateClass<Class, value> 이런식으로 하고, 이 TemplateClass의 멤버 초기화 리스트에서 Class의 생성자로 value를 넘겨주라는 뜻인가요...?

이번엔 딱한번 등장하는 거라서 따로 템플릿을 만들긴 좀뭐하지만...다음번에 자주 쓰게 될일이 있으면 활용해야겠네요.

감사합니다.

댓글 달기

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