2016-09-07 2 views
0

C++에서 정의 된 유형의 3D 배열을 포함하는 클래스가 있습니다. int의 값을 가지며 3d 배열에 대한 속성을 설정하고 가져올 수있는 여러 속성을 정의해야합니다.3D 배열에 대한 setter/getter 속성 정의

Attributes: 
LabelTag; // Vox tag e.g. an int tag=2 
NumberofPoints; // Vox nr of containing points e.g. int nr=5 


Vox.setAttribute(LabelTag tag, Value 2); 
Vox.setAttribute(NumberofPoints nr, Value 5); 

int tag  = Vox.getAttribute(LabelTag); 
int nrofpoints = Vox.getAttribute(NumberofPoints); 

가 어떻게 그럼 어떻게 구조체 또는 타입 정의 또는 다른 무언가로, 속성을 정의하고,해야한다 : 나는 정의 할 필요가 예를 들어

//header; 
    class Voxel 
    { 
     private: 
     vector< vector < vector < myPoints* > > > Vox; // 3D array 
     public: 
     //... 
    }; 

    //Here is the constructor and methods of the class: 
    Voxel::Voxel(myType var1; double var2) 
    { 
    // this is constructor 

    } 

이있는 것처럼 INT 값을 "속성" 내 3D 배열 멤버에 값을 설정할 수 있습니까? Vox, 내부의 점이 아닌 Vox 자체에 속성을 설정하고 싶습니까? 가능한가? 개인 또는 공개로 정의해야합니까?

+5

포인터를 저장하면 "화살표"구문을 사용합니다. Vox [i] [j] [k] -> getAttribute() – StoryTeller

+0

LabelTag 및 NumberOf Points의 용도는 무엇입니까? 벡터 당 하나의 점을 저장할 수 있으므로 한 3D 배열에 3 점이 있습니다. – pospich0815

+0

@ pospich0815, 그것은 태그 디스패치를 ​​영리하게 (아마) 사용하려고 시도합니다. 템플릿 전문화는'getAttribute

답변

1

편집 된 대답은 암호.

좋아, 먼저 @StoryTeller에 의해 댓글이 달린대로 벡터에 포인터가 저장됩니다. 그래서 당신이 가리키는 객체에 접근하기 위해서는 -> 문법을 사용해야 할 것이다.

구조체가 일반적으로 보이지 않으므로 아마 myPoints 클래스를 설정해야합니다 (C++의 구조체는 해당 속성 및 함수에 대한 기본 액세스 한정자를 제외한 클래스와 동일합니다). 내가

class myPoints // you should probably split this into a header and cpp 
{ 
    int tag; 
    int noOfPoints; 

    myPoints() : tag(0), noOfPoints(0) // construct with whatever values, you can pass your own 
    {} 

    void setNoOfPoints(noOfPoints) 
    { 
     this->noOfPoints = noOfPoints; 
    } 

    void setTag(tag) 
    { 
     this->tag = tag; 
    } 

    int getNoOfPoints(){ return noOfPoints; } 
    int getTag(){ return tag; } 
}; 

당신이 어떤 * myPoints와 복스를 초기화 한 가정처럼 뭔가를 찾기 위해이 클래스를 상상하는 것 당신은 단순히 액세스하고 위의를 떠나

int tag = Vox.at(i).at(j).at(k)->getTag(); 
int noOfPoints = Vox.at(i).at(j).at(k)->getNoOfPoints(); 

Vox.at(i).at(j).at(k)->setNoOfPoints(6); 
Vox.at(i).at(j).at(k)->setTag(6); 

을 다음과 같이 myPoints 개체를 사용할 수 있습니다 리터럴 대답, @ Aconcagua의 답변과 마찬가지로, 나중에 유용하다고 생각할 수도 있습니다.

어쨌든 @StoryTeller가 말했듯이 이미 작성한 코드에서 Voxel 클래스를 사용하여 각 벡터에 대한 noOfPoints 속성을 사용할 수 있습니다. . 복셀 클래스는 다음과 비슷한 모습이 될 것입니다, 단순히 복셀의 인스턴스를 생성, 당신의 벡터에 액세스하고 태그와 noOfPoints을 설정하기 위해 다음과 같이 (헤더를 제공하지 않는 나의 게으름을 용서)

class Voxel 
{ 
private: 
    vector< vector < vector < myPoints* > > > Vox; 

    int tag; 
    int noOfPoints; 
public: 
    Voxel() : tag(0), noOfPoints(0) // construct with whatever values, you can pass your own 
    {} 

    vector< vector < vector < myPoints* > > >& getVox(){ return Vox; } //Ignore my shitty naming scheme, you can use this to set or get elements 

    void setNoOfPoints(noOfPoints) 
    { 
     this->noOfPoints = noOfPoints; 
    } 

    void setTag(tag) 
    { 
     this->tag = tag; 
    } 

    int getNoOfPoints(){ return noOfPoints; } 
    int getTag(){ return tag; } 
}; 

을보고합니다

//A new vector of voxels 

vector<Voxel> voxels; 

voxels.push_back(Voxel); // this only needs to be a 1d array, you can construct each voxel however you like and add as many as you like 

//settting the tag for the first element 

voxels[0].setTag(0); 

//getting the tag for the first element 

int tag = voxels[0].getTag(); 

// manipulating the contained vector 

voxels[0].getVox().at(i).at(j).at(k) = //whatever you are storing in your vector 
+0

이 답변은 내가 필요한 것에 가깝지만 질문을 편집 할 때 Vox 자체에 이러한 속성을 할당 할 수 있습니까? myPoints는 점마다 다른 값을 가질 수 있지만 이러한 myPoint가 포함 된 Vox는 '속성'당 하나의 값을 가져올 수 있습니다. 또는 Vox 중 일부가 비어 있지만 여전히 일부 속성을 할당 할 수 있다고 상상해보십시오. – Bruce

+0

가능합니다! Infact 당신의 Voxel 클래스와 올바른 줄에 지적했다, 나는 내 대답을 편집했습니다 도움이 되길 바랍니다 :) – George

+0

고마워, 내가 귀하의 코드를 구현하고 그것이 내가 찾고있는 것과 아주 가깝다. 단지 내가 중요한 것을 이해하지 못한다. "태그 속성"을'i_Voxel.setTag (6)'로 설정하면 무엇으로 설정됩니까? !! 나는'Voxel'의 인스턴스를 가정합니다. 그러나 Vox의 어떤 벡터가 설정되었는지 어떻게 알 수 있습니까? 모든 벡터를 반복하면서 각 벡터에 태그를 설정하려고한다고 가정 해 봅시다. 어떻게 작동하는지 설명해 주시겠습니까? – Bruce

0

편집 : 조지 헨리의 답변을보고, 내가

대신 대답을 삭제하는 ..., 당신이 질문을 오해는 복셀 클래스 외부에서 포인트를 액세스에 대한라고 생각했을 수 있습니다,하지만, 난 여전히 남겨 여기에이 문제에 실행되는 경우에 그 어느 나중에 및 찾으 유용한 포인터 문제 이야기꾼에서 별도로


이미 언급 다음 ..., 당신은 조금있다 문제 :

간단히 인덱스 연산자를 정의 할 수 있지만이 인덱스 연산자는 vector<vector<myPoints*>> (한 벡터 이하) 또는 vector<vector<vector<myPoints*>>>::iterator에 대한 참조를 반환해야합니다. 그러나, 이는 사용자가 기본 벡터, 예를 들어, 벡터를 수정할 수있게한다. 지. 그들을 지우고. 이제 const vector 또는 const_iterator를 반환하면 사용자는 저장된 값 (setAttribute ... 호출)을 수정할 수 없습니다. 당신은 명시 적 getter 함수를 쓰기

  1. :

    그래서 당신은 두 가지 옵션이 있습니다 .. 또한, 그는 적어도 첫 번째 경우에, 멀리 const를 캐스팅 수 있고, 다시 자기가 원하는 일을 할 mypoints* getPoints(int x, int y, int z) { return vox[x][y][z]; }
  2. 벡터를 별도의 클래스로 래핑합니다. 그런 다음 각 클래스는 기본 벡터에 대한 적절한 액세스를 제공 할 수 있으며 동시에 사용자가 불법적 인 작업을 수행하는 것을 방지 할 수 있습니다. 이 클래스의 각각은, 당신의 외부 복셀 클래스를 할 것 같은를 자신의 연산자 []를 제공 할 것이다 :

class Voxel 
{ 
public: 
    class Points1D 
    { 
     vector<myPoints*> points; 
    public: 
     myPoints* operator[](unsigned int index) { return points[index]; } 
    }; 
    class Points2D 
    { 
     vector<Points1D> points; 
    public: 
     Points1D& operator[](unsigned int index) { return points[index]; } 
    }; 
    Points2D& operator[](unsigned int index) { return points[index]; } 
private: 
    vector<Points2D> points; 
}; 

당신이 다음 수업을 통해 당신을 반복 할 수있게하려면 적절한 반복자와 아마도 다른 것들 (예를 들어 size() 함수)을 제공해야 할 것입니다 - 사용자가 당신의 클래스로 무엇을 할 수 있는지에 따라 ...

0

어쩌면 그것은 당신의 질문에 대답하지 않습니다하지만 당신은 C# - 비슷한 세계에서 온 것 같은 당신은 내가 당신의 질문을 재구성 할 수있을 것입니다 다음 희망 (제가 몇 가지를 명확히 할 수 있도록이 보인다, 그래서 보통의 C++ 프로그래머는 이해할 수있다 :

속성의 개념은 C++에서 전혀 다른 meaning입니다 (구현하려는 것과 관련이 없다고 생각합니다)

또한 C++에서 별도의 개념 (예 : getters/setters)이 없습니다. 대신 getSmth() 또는 setSmth (type arg) 멤버 함수를 작성하십시오. 그들의 목적은 사용자에게 private 멤버 변수에 대한 제어 된 액세스 권한을 부여하는 것입니다. 그러나 이러한 기능은 지금은 특별한 능력을 갖춘 정회원 일뿐입니다. 당신이 얻고 싶은 경우에

은/멤버 변수는 "myPoint는"당신은 당신이 그러나

int main() 
{ 
    vector<vector<vector<myPoint*>>> Vox; 
    Vox[1][2][3]->SetTag(10); 
    cout << Vox[1][2][3]->GetTag(); 
} 

을 쓸 수있는 멤버 함수 다음

class myPoint 
{ 
private: 
    int tag; 
//... 
public: 
    int GetTag(); 
    { 
     return tag; // return this->tag; 
    } 

    void SetTag(int t) 
    { 
     tag = t; 
    } 
} 

를 정의 할 필요가 말하는 클래스에서 "태그"를 말할 설정 다른 변수에 대한 getter/setter가 몇 개 있다고 가정 해 보겠습니다. 그런 다음

Vox[1][2][3]->GetAtribute(tag); 

를 작성하고 "오, 그가 태그 멤버 변수의 값을 얻을 필요가있다"고 파악하는 컴파일러를 예상 할 수있는 방법이 없습니다. C++ 클래스 시스템에는 클래스 멤버 변수와이를 사용할 수있는 멤버 함수 만 있습니다. 모든 것이 간단합니다.

재미있는 점은 값뿐만 아니라 유형도 매개 변수화 할 수 있다는 것입니다. 그런 다음 함수 템플릿을 만들고 설정 한 유형에 따라 동일한 함수의 다른 버전을 호출 할 수 있습니다. 이를 사용하여 getter 또는 setter를 호출 할 속성 (실제로 멤버 변수)을 정의 할 수 있습니다.

// LableTag is a class defined globally and GetAttribute() is a member 
//template function 
int i = Vox[1][2][3]->GetAttribute<LableTag>(); 

그러나 getters/setters를 정의하는 데 사용되는 것을 보지 못했습니다. 일반적으로 "무언가를 얻으려면"구체적인 멤버 함수 인 GetSomething()을 작성하십시오.

관련 문제