2016-08-01 28 views
-4

内部オブジェクトがあるクラス実装する場合:(再)割り当て

std::vector<std::vector<bool>> a; 

クラスはfalseを割り当てるoperator[]このオブジェクトを初期化します。我々は現在の状態を反映するために、このオブジェクトを更新プライベートメンバ関数の間に

for(auto i = 0; i < limit; ++i) { 
    for(auto j = 0; j < limit; ++j) { 
     a[i][j] = false; 
    } 
} 

、のようobject.xobject.yはタイプintであることに注意とnew_y

a[object.x][object.y] = false; 
a[new_x][new_y] = true; 

使用されているオブジェクトのクラスがある:

class object { 
public: 
    object(): x(0), y(0) { } 
    int x; 
    int y; 
}; 

はなぜコンパイラは、初期化を可能とするが、その後言うん:

error: expression is not assignable 

私は少しを再割り当てしていたときにプライベートメンバ関数のベクトルで?

Object.hpp:コンパイルするために打ち鳴らすを使用

#ifndef OBJECT_HPP 
#define OBJECT_HPP 

class Object { 
public: 
    Object(): x(0), y(0) {} 
    Object(int x, int y) : x(x), y(y) {} 
    int x; 
    int y; 
}; 
#endif` 

main.cppに

#include "Object.hpp" 
    #include <vector> 

    class Function { 

     public: 
      Function() : a(10, std::vector<bool>(10)) { } 

      void moveObjects() { 
       for(int i = 0; i < 10; ++i) { 
        editObjects(i,i); 
       } 
      } 

     private: 
      void editObjects(int new_x, int new_y) const { 
       a[new_x][new_y] = true; 
      } 


     std::vector<std::vector<bool>> a; 
    }; 

    int main() { 
     Function f; 

     f.moveObjects(); 
    } 

がエラーを受信:

clang++-3.8 main.cpp -std=c++14ここ

は最小完全検証例であります

+1

あなたの 'object'クラスと呼び出し(新しい値を割り当てる場所)を見ることができますか?たぶん、「公的」に設定する必要があるものがありますか?そして問題が 'auto'を選んでいると思うなら、それを基本的な' int'に変更して試してみてください。 –

+0

また、メンバー関数は 'const'ですか? –

+4

基本的には、[mcve]を作成する必要があります –

答えて

0

問題は、プライベートメンバ関数ではconstmutableするオブジェクトを変更することと定義されている問題を解決します:あなたが今まで許可されているので、正しくないことを

void editObjects(int new_x, int new_y) const { 
    a[new_x][new_y] = true; 
} 

mutable std::vector<std::vector<bool>> a; 
+0

ビットベクトルは、後で更新および再キャッシュする必要のあるオブジェクトを格納するためのキャッシュとして使用されています。このオブジェクトは世界の直接的な状態ではなく、世界が変化したときの本の保有に使われているだけなので、ここでは「変更可能」といいます。 –

+0

その場合、変更可能な問題の数は少なくなります。スレッドの安全性を確実に確保してください。 – jaggedSpire

2

あなたが持っていますconstメンバ関数でaを変更してください。関数から修飾子constを削除します。

void editObjects(int new_x, int new_y) { 
    a[new_x][new_y] = true; 
} 
関連する問題