> 백엔드 개발 > C++ > 기본 생성자 없이 객체 배열을 초기화하는 방법은 무엇입니까?

기본 생성자 없이 객체 배열을 초기화하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-27 06:15:12
원래의
783명이 탐색했습니다.

How to Initialize Object Arrays Without a Default Constructor?

기본 생성자 없이 객체 배열 초기화

객체 배열은 프로그래밍에서 일반적으로 사용되지만 기본 생성자가 없는 클래스로 초기화할 때 문제가 발생할 수 있습니다. . 다음 코드를 고려하세요.

class Car {
private:
  Car(){};  // Private default constructor
  int _no;
public:
  Car(int no) {
    _no = no;
  }
};
로그인 후 복사

이 클래스 내에서 기본 생성자(Car())는 비공개입니다. 즉, 인수를 제공하지 않으면 Car 유형의 객체를 만들 수 없습니다. 그러나 Car 객체의 배열을 초기화할 때 컴파일러는 각 요소에 대한 기본 생성자를 호출하려고 시도하여 오류가 발생합니다.

cartest.cpp:5: error: ‘Car::Car()’ is private
cartest.cpp:21: error: within this context
로그인 후 복사

Placement-New를 사용한 솔루션

이 문제를 극복하기 위해 배치 신규를 사용할 수 있습니다. Placement-new를 사용하면 객체 생성자를 호출하지 않고도 해당 메모리 위치에 직접 메모리를 할당하고 객체를 생성할 수 있습니다. 구현 방법은 다음과 같습니다.

int main() {
  void *raw_memory = operator new[](NUM_CARS * sizeof(Car));  // Allocate raw memory
  Car *ptr = static_cast<Car *>(raw_memory);  // Cast to a pointer to Car
  for (int i = 0; i < NUM_CARS; ++i) {
    new(&amp;ptr[i]) Car(i);  // Call placement-new to construct Car objects in-place
  }
}
로그인 후 복사

placement-new를 사용하면 기본 생성자를 명시적으로 호출하지 않고도 객체 배열을 초기화할 수 있습니다. 객체는 생성되어 할당된 메모리에 직접 배치됩니다.

기본 생성자를 피할 때의 이점

Scott Meyers의 "More Effective C" 항목 4에서 언급했듯이, 불필요한 기본 생성자를 피하면 프로그램 정확성과 유지 관리 가능성이 향상될 수 있습니다. 기본 생성자는 종종 클래스 디자인에서 모호성을 초래하고 클래스 불변성을 적용하기 어렵게 만들 수 있습니다. 프로그래머는 생성자를 명시적으로 정의함으로써 해당 클래스의 객체가 특정 인수 집합을 통해서만 생성될 수 있다고 주장하여 더 큰 제어와 명확성을 보장합니다.

위 내용은 기본 생성자 없이 객체 배열을 초기화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿