2016-09-07 3 views
0

C++では、定義されたタイプの3D配列を含むクラスがあります。 intの値を持ち、3次元配列の属性を設定して取得できる複数の属性を定義する必要があります。3D配列のセッター/ゲッターアトリビュートを定義します。

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); 

がどのように私は、その後どのように構造体として、またはtypedefのか、何か他のものとして、属性を定義し、必要があります:私は定義する必要がある。例えば

//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の使い方は? Vectorごとに1つのPointを保存することができるので、1つの3D配列に3つのPointを持つことができます。 – pospich0815

+0

@ pospich0815、それは賢明な(多分)タグディスパッチの使用を試みています。テンプレートの特殊化は 'getAttribute

答えて

1

編集された答えはコード。

まず、@StoryTellerによってコメントされているように、あなたのベクトルはポインタを格納しています。 - >構文を使用して、それらが指しているオブジェクトにアクセスする必要があります。

構造体が一般的に見られないので、おそらくmyPointsクラスをセットアップするべきです(C++の構造体は、プロパティと関数のデフォルトのアクセス修飾子を除くクラスと同じです)。私はあなたが、単にアクセスし、

上記を残し
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オブジェクトを使用することができますが、いくつかの* myPointsリテラルとVOXを初期化してきたと仮定すると、

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; } 
}; 

のようなものを見て、このクラスを想像します答え、@ 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は「属性」ごとに1つの値を取得できます。または、Voxのいくつかが空であると想像しても、私はそれらにいくつかの属性を割り当てることができます。 – Bruce

+0

可能です! InfactはあなたのVoxelクラスで正しい行になっていると指摘されていましたが、私は自分の答えを編集しました。それは助けてくれるでしょう:) – George

+0

ありがとう、私はあなたのコードを実装して、ちょうど私が1つの重要なことを理解していない。 "タグ属性"を 'i_Voxel.setTag(6)'で設定します。私は 'Voxel'のインスタンスを想定していますが、Voxのどのベクトルが設定されているかをどのように知っていますか?私はすべてのベクトルにループを持ち、各ベクトルにタグを設定したいとしましょう。どのように動作するか説明できますか? – Bruce

0

編集:はジョージ・パーセルの答えを見て、私はあなたが疑問誤解しているかもしれない、

代わりの答えを削除...それはボクセルクラスの外からポイントへのアクセスについてだと思った、しかし、私はまだ残してそれここにあなたがどんな後でこの問題に遭遇し、ストーリーテラーは、すでに述べたポインタの問題から便利その後、 ...

別に

を見つけた場合について、あなたは少しを持っています問題:

単純にインデックス演算子を定義できますが、このインデックス演算子はvector<vector<myPoints*>>(1つ少ないベクトル)またはvector<vector<vector<myPoints*>>>::iteratorへの参照を強制的に返します。しかしながら、これは、ユーザが基礎となるベクトルを修正することを可能にする。 g。それらをクリアする。 const vectorまたはconst_iteratorを返すと、ユーザーは(setAttribute ...を呼び出して)格納された値を変更できなくなります。

  1. あなたは明示的なgetter関数を記述します:
    ...

    をさらに、彼は、少なくとも最初のケースでは、離れのconstをキャストでき、その後、再び、彼が望んで行うので、次の2つのオプションがあります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#-kind世界から来ましたようにあなたは私が(私は、あなたはあなたの質問を再定式することができるよう願っていますいくつかのことを明確にしましょうので、それは、見えます普通のC++プログラマが理解できるように:)

属性のコンセプトはC++で全く異なるmeaningです(私はあなたが実装したいものとは無関係だと思います)

また、C++ではプロパティの別の概念(getters/setters)もありません。 代わりに、getSmth()またはsetSmth(type arg)メンバ関数を記述するだけです。 目的は、ユーザーにプライベートメンバー変数への制御されたアクセスを与えることです。しかし、これらの機能は今や特別な能力を持つ通常のメンバー機能に過ぎません。あなたが取得したい場合は

は/メンバ変数は、「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; 
    } 
} 

を定義する必要があると言うクラスから「タグ」と言う設定しました異なる変数のゲッター/セッターがいくつかあるとします。 はその後

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

を書いて、「ああ、彼はタグのメンバ変数の値を取得する必要があります」ということを把握するコンパイラを期待する方法はありません。 C++クラスのシステムには、クラスメンバ変数とそれを使用できるメンバ関数しかありません。それだけですべてが簡単です。

興味深いことに、値だけでなく型もパラメータ化できます。次に、関数テンプレートを作成し、設定したタイプに応じて同じ関数の異なるバージョンを呼び出すことができます。これを使用して、ゲッターまたはセッターと呼ぶ属性(実際にはメンバー変数)を定義することができます。

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

しかし、私はそれはゲッター/セッターを定義するために使用されて見ていません。通常、「何かを取得する」場合は、GetSomething()という具体的なメンバー関数を作成します。

関連する問題