2011-08-28 4 views
0

나는 다음과 같은C++ 데이터 멤버. 목표 : 생성자에서 초기화 한 다음 혼자두면 const가 여기에서 작동합니까?

struct dweDMPair { 
     const dweller *occu; 
     const double sqDM; 
     float prob; 
     dweDMPair(dweller *inOccu, double sqdm) : occu(inOccu), sqDM(sqdm) {}  }; 

나는 이러한 개체에 대한 포인터의 배열을 반환하고 싶지만 그들이 실수로 클라이언트에 의해 삭제되어서는 안된다는 욕망이있다. 아니면, 잘못, 어쩌면이 디자인 반복을 시도해보십시오.

내 질문은 (const 접두어로 설명한 것처럼) 멤버가 생성자에서만 할당된다는 것을 (매우 간결하고 깔끔하게) 지정하는 방법이 있습니까?

개인/공개 및 인터페이스/방법이 이것을 분류 할 수 있지만 유머는 어느 정도인지, const 키워드가 악용 될 수 있다는 것을 알고 있습니까?

_ 편집 _

나와 즈, 내 목표는 생성자에서 한 번 만 3 명 데이터 멤버의 2를 초기화하는 것입니다. 그런 다음이 인스턴스를 const dweDMPair * ptrToVal로 내 보내면 클라이언트는 delete 인스턴스를 호출 할 수 없으므로 const 인스턴스에 대한 포인터에서 작동하지 않으므로 삭제할 수 있습니까? 그러면 고객은 세 번째 멤버 인 prob에 대해 고유 한 가치를 부여합니다. 예, 기능이 보호 기능을 수행하는 것을 알고 있지만 더 빨리 사용하고 싶습니다.

멤버는 정적이지만 인스턴스 멤버 일 수 없습니다. 혹시 궁금한 점이 있으시면 ..

+2

질문이 명확하지 않습니다. 더 많은 단어를 사용하여 설명해야합니다. – Nawaz

+0

"빨리 원합니다"- 더 빨리 원합니까? 나는 아마 당신이 인라인 함수를 사용한다면 아마 어떤 것에도 있지 않을 속도 문제에 대해 걱정하고 있다고 생각한다. –

+0

@ 마이클, 내 아바타를 바꾸어야합니다. 나는 게임을 쓰고 있으므로 항상 속도 문제가있을 것입니다. 창의력 수준에 이르면 이미지 문제가있는 아바타를 업데이트 할 것입니다. – John

답변

1

당신은 당신이 정말로 원하는 것을 명확히하는 것입니다 : 그에서 const 포인터에서 작동하지 않습니다 때문에 클라이언트가 다음 삭제 - 호출 할 수 있도록

그때 나는 const를 dweDMPair * ptrToVal으로이 인스턴스를 내보낼 수 있습니다 인스턴스가 그것을 할 것인가?

const에 대한 포인터에서 삭제를 호출 할 수 있으며 const 멤버가 포함 된 개체에서 호출 할 수 있습니다. const을 사용한다고해서 목표를 달성하는 데 도움이되지는 않습니다.

불만없이 컴파일 일부 예제 코드 :

struct dweller { 
}; 

struct dweDMPair { 
     const dweller *occu; 
     const double sqDM; 
     float prob; 
     dweDMPair(dweller *inOccu, double sqdm) : occu(inOccu), sqDM(sqdm) {}  
}; 

int main() { 

    dweDMPair const* p = new dweDMPair(NULL, 3.14); 

    delete p; 
} 

당신은 (그것을이 하나가 너무 많이 변경한다면 아마도 또 다른 질문에) 더 당신의 최종 목표를 명확히 할 수 있습니다.

+0

고마워요. 그리고 사과를 더 해주고 AndrzejJ에게 감사드립니다. – John

2

예, const는 원하는 것을 수행합니다. 생성자 이니셜 라이저 목록에서 수행하는 작업은 할당이 아니라 초기화임을 유의하십시오. 당신은 const 객체에 할당 할 수 없지만, 값으로 초기화 할 수 있습니다. 또한 const에 관계없이 클래스의 멤버를 전용 멤버로 캡슐화하는 것이 좋습니다. 훨씬 더 많은 타이핑은 아니지만 유지 보수성이 향상됩니다.

편집 :

당신이 가리키는 const 포인터를 정의하려면 :

Type * const member; 

하지

const Type* member; 

두 번째 구문은 const를 입력하지 CONST 포인터 포인터이다.

+0

두 번째 구문은 내가 선언 한 상수 인스턴스에 대한 포인터입니다. 초기화시에도 할당 할 수 없으므로 작동하지 않는다는 것을 의미합니까? 그리고 그것은 첫 번째 구문 (상수 포인터)을 사용하면 작동합니까? – John

+0

기술적으로 pointer-to-const 구문은 가리키는 타입이'const Type' (당신의 예제에서는'const dweller')이라는 것을 의미합니다. 가리키는 인스턴스는 const 일 수도 있고 아닐 수도 있습니다. 그러나 포인터는이를 가리키는 것으로 간주합니다. 참조 된 객체에 대해 수정 (비 const) 연산을 허용하지 않습니다. 이것은 _value_가 변경 될 수없는, 즉 다른 오브젝트로 다시 지시 될 수없는 포인터 인 const 포인터와 다릅니다. 'const Type * const member' 또는'const const * const member' 형식을 사용하여 둘을 결합 할 수 있습니다. – AndrzejJ

+0

할당과 관련하여 할당은 값이있는 변수 나 멤버를 초기화하는 것과는 다른 작업입니다. 예 : 'int i = 3' 문은 할당이있는 것처럼 보이지만 실제로는 그렇지 않습니다. 초기화는 객체가 구성 될 때 객체에 초기 값을 제공합니다. 즉 객체가 이전에 존재하지 않았고 초기화 값이 처음 값이되는 경우입니다. 할당은 이전에 존재하는 객체의 값을 변경합니다. 생성자 이니셜 라이저 목록에서 수행하는 작업은 할당이 아니라 초기화입니다. – AndrzejJ