2016-04-05 11 views
0

私は非常に単純なことを達成しようとしています。クラスのインスタンスが作成されるとき、つまりコンストラクタを呼び出すときに、クラスの保護されたconstメンバを初期化する必要があります。このような何か:クラスコンストラクタで保護されたconstを初期化する

MyClass.hpp: 
class MyClass { 
public: 
    //some methods 

MyClass(){} //Constructor 
protected: 
const int Variable; 
}; 

MyClass.cpp: 

//some method definitions 
MyClass::MyClass(int newVariable): Variable(newVariable) {} //constructor 

私は、それぞれが独自の多かれ少なかれ啓発コンパイラエラーを与え、staticキーワードや他のものを試してきました。この例では、「コピー代入演算子は暗黙的に削除されています。

これは、メンバーを保護し始めてから、すべてが正常に機能していたので、むしろイライラしています。

補足:一度定義したconstメンバを変更できない場合は、保護とgetter/setterメソッドの作成はまだ必要ですか?

編集2最後の部分は、.cppファイルに

ある

#ifndef Servo_hpp 
#define Servo_hpp 
#pragma once 

class Servo{ 
    friend class Grid; 
public: 
    Servo(int newID, int newRow, int newCol); 
    //Some other methods 

const int row; 

const int column; 

const int number; 

double currentAngle; 

double nextAngle; 

double currentSpeed; 

const int ID; //TODO: Change to new grid 
}; 

#endif /* Servo_hpp */ 

Servo::Servo (int newID, int newRow, int newCol): ID(newID), column(newCol), row(newRow), currentAngle(0), currentSpeed(0), number(0){} 

:関連するコード:それは本当に...

EDITを開発をスピードアップしません。 MyClassのベクター配列を作成しようとすると問題が発生します。

std::vector<MyClass> MyClassArray; 
    for (int Variable = 0; Variable < 5; Variable++) { 
     MyClassArray.push_back(*new MyClass(Variable)); 
    } 
} 

上記のクラス定義と共にこのコードを書いた場合、これはg ++で正常に準拠しますが、XCodeは "オブジェクトの型 'MyClass'を暗黙的に削除するため、割り当てできません。問題を理解することができます:constメンバーを割り当てることはできませんが、どこでもMyClassをコピーしませんか?

+2

だから、実際の問題は何ですか?エラーメッセージはかなり簡単です。 *コピー代入演算子は暗黙的に削除されます。*これは、 '変数 'を変更できないので、既に作成された' Myclass'に 'Myclass'を割り当てることはできません。 – NathanOliver

+0

ありがとう、根本的な問題は:MyClassのインスタンスが作成されたときに 'Variable'を特定の値に設定してから、その値がそのインスタンスの生存期間同じであることを確認してください。 – chris1992

+0

です。だから、実際にどのようなコードを使っているのですか?もしあなたが*この値が生存している限り、そのインスタンスのために同じままであることを確認したいなら、あなたは 'Myclass a {42}、b {50};を実行できません。 a = b; ' – NathanOliver

答えて

1

この例では、「コピー代入演算子は暗黙的に削除されています。

これは理にかなっています。代入は突然変異操作であり、オブジェクト(データメンバー)constを突然変異させる必要があります。クラスを割り当てられないように設計しました。

protectedはここでは該当しません。

注2:あなたは、あなたのクラスを構築デフォルトすることができるようにしたい場合は、デフォルトのコンストラクタでそのデータメンバを初期化する必要があります。

MyClass(): Variable(42) {} 
+0

私は私の考えを主張していません。タスクは、 'MyClass'のインスタンスが作成されたときに' Variable'を設定し、特定のインスタンスが存在する限り、この値が変更されないようにします。もちろん、MyClassの他のインスタンスでは異なる場合があります – chris1992

+0

@ chris1992右。代入はインスタンスを変更するため、代入が許可されないようにしても問題ありません。 – juanchopanza

関連する問題