2010-07-11 1 views
1

가 :C++에서 사용자 정의 클래스/구조체의 배열 생성자에 배열 키를 가져 오시겠습니까? 나는이 같은 간단한 클래스가있는 경우

class MyClass 
{ 
    MyClass(){} 
    ~MyClass(){} 
public: 
    int myArrayKeyValue; 
}; 

그리고 나중에, 나는이 클래스의 배열을 만들 :

MyClass testing[10]; 

생성자에서, 나는 배열의 키에 액세스 할 어떻게, 정말 배열의 각 요소에 대해 myArrayKeyValue을 적절하게 설정할 수 있습니까? 그래서 이것을 얻을 수 있습니다 :

testing[0].myArrayKeyValue = 0; 
testing[1].myArrayKeyValue = 1; 
testing[2].myArrayKeyValue = 2; 
testing[3].myArrayKeyValue = 3; 
etc... 

생성자에서이 작업을 수행 할 수 있습니까? 아니면 배열을 반복하고 값을 수동으로 할당해야합니까?

답변

3

생성자에서이를 수행 할 수 있습니까?

번호

또는 내가 배열을 그냥 루프를 수동으로 값을 할당합니까?

예. 색인 외부에있는 외부의 지식을 필요로하지 않도록 다시 설계 할 수는 있습니다.

가능한 대안이 포함됩니다 :

  • 연관 컨테이너 키 값을 가진 set<MyClass> 당신은 생성자에서 직접이 작업을 수행 할 수
0

주문 기준에게있는

  • map<int, MyClass>처럼; 배열의 객체 위치에 액세스 할 수 없습니다. 초기화를 수행하려면 루프를 작성해야합니다.

    다른 방법으로 - 그리고 저는 이것을 언급하는 것에서 약간 혐오 스럽습니다 - 생성자에서 증가하는 전역 카운터 또는 정적 카운터를 사용하십시오. 건설 순서는 배열의 시작부터 끝까지 진행되도록 보장되므로 기술적으로 효과가 있습니다. 그러나 그것은 끔찍한 일입니다.

    는 (배열 선언도 컴파일되지 않을 것이다, 그래서 덧붙여, 귀하의 예제에서 생성자는 비공개입니다.)

  • 0

    단순해야 생성자에서 증가 static 회원 제로. 배열을 만들기 전에 재설정해야합니다. 다음과 같이 좋은 생각은 완전히 다른 주제 :

    +2

    . 두 개의 다른 스레드에서 알고리즘을 동시에 수행해야하는 경우에는 어떻게해야합니까? –

    +0

    음, 모든 코드가 스레드되지는 않습니다. 하지만 나는 이것이 좋은 생각이라고 말하지 않았지? :) –

    +0

    그가 자신의 OS를 구축하면 어떨까요? 주어진 정보에 적합한 해결책에 대해 투표를하지 마십시오. 그것이 다중 스레드라면, 그는 그것을 precize했을 것이다. –

    -1

    입니다 여부 또한 정적 카운터를 사용할 수 있습니다

    class MyClass { 
        static size_t static_counter; 
    
        size_t m_value; 
    public: 
        MyClass() { 
         m_value = static_counter++; 
        } 
    
        inline static void reset() { 
         static_counter = 0; 
        } 
    
        inline size_t get_value() const { 
         return m_value; 
        } 
    }; 
    
    size_t MyClass::static_counter = 0; 
    

    하지만 당신은 Responsibility는 수동으로 재설정 또는 메모리 침입이있을 것이다있다. 이것은 더 높은 레벨에서 캡슐화함으로써 (소멸자에서 리셋 됨) 수정 될 것입니다.

    편집 : Nikolai N Fetissov와 같은 생각이 들었습니다. 정적 멤버는 멀티 스레드 프로그램에서 사용되지 않아야합니다.이 같은

    +0

    아래로 투표 하시겠습니까? 다른 사람들이 테스트 된 코드로 답하는 것을 권장하지는 않습니다. –

    +0

    이 유형의 정적 초기화는 좋은 해결책이 아닙니다. 예, 가능하며 작동 할 수도 있지만 정확히 언급 한 이유 때문에 문제가됩니다. –

    +1

    프로그램이 다중 스레드로 예정되어 있고 무엇보다 우리가하는 일을 모르는 경우에만 좋지 않습니다. 약점을 명확하게 보여주는 솔루션에 대해 투표를하는 이유는 무엇입니까? 모노 또는 멀티 스레드 일지 여부에 관계없이 주제를 만든 사람이 선택해야합니다. –

    0

    뭔가 가능할 것이다 :

    class MyClass { 
    public: 
        MyClass(int index) { myArrayKeyValue = index; } 
        ~MyClass(); 
    private: 
    int myArrayKeyValue; 
    }; 
    
    int main() 
    { 
        MyClass testing[5] = { MyClass(1), MyClass (2), 
            MyClass (3), MyClass (4), MyClass (5) }; 
    
        return 0; 
    } 
    
    +0

    가능하지만 명확하게 압축되지 않음 :/인스턴스가있는 것처럼 명시 적으로 많은 작성 (또는 복사/붙여 넣기)이 가능합니까? –

    +0

    누군가가 루프 시퀀스를 사용하는 대신 값이 다른 객체 배열을 초기화하려고하는지 여부에 따라 다릅니다. – cpx

    0

    당신이 원하는 결과와 다른 방법으로 그것을 달성하려고 무엇을 말 고려하는 것이 유용 할 수 있습니다. 진행

    한 가지 방법이 될 수 있습니다

    재앙의
    std::vector<MyClass> v; 
    for (size_t i=0; i<nCount; i++) 
        v.push_back(MyClass(static_cast<int>(i))); 
    
    +0

    그 루프 솔루션 (나를 위해 최고의,하지만 그는 건설 방법을 원하는 것 같다),하지만이 경우 myArrayKeyValue 직접 size_t, static_cast 2^15보다 큰 값의 예를 피하기 위해 (size_t 동일합니다 ~에 부호없는 정수). –