2017-12-10 5 views
0

私は独占ゲームをプログラミングしています。そして、私は本当に素敵なクリーンな出力を作るためのソート機能が大好きです。この例では、プレイヤーがグループで所有しているプロパティをソートしています。すべてのコンパイルエラーC2280、削除された関数演算子を参照しようとしました=

まず、ここでプレイヤーは、これらのプロパティのリストを所有している、今、私の財産ソーター機能

bool propertySort(Property a, Property b) { return a.getGroup() < b.getGroup(); } 

です。

#pragma once 
#include <string> 
#include <vector> 
#include "Dice.h" 
#include "Property.h" 

class Player 
{ 
public: 
    ... 
private: 
    int curMoney{ 1500 }; 
    int curLocation{ 0 }; 
    int playerNum{ 0 }; 
    std::string name; 
    std::vector<Property> ownedProperties{}; 
    int curDiceRoll; 
}; 

ご覧のとおり、0属性に初期化されたプライベート属性です。

メインの私のプロパティソーターでは、プレーヤーが見るためにボード上にプロパティを表示するので、ソーター機能は常にエラーC2280を与え続けます。私はソートラインをコメントアウトするとプログラムがうまく動作するので、このエラーが発生するのはこのソート関数であることはわかっています。私は初心者のプログラマーなので、私が無知なことは明らかです。もし誰かがそれが何であるかについての洞察力を提供することができたら、それはすばらしいでしょう、ありがとう!場合

void viewProperties(Player& p) 
{ 
    string prompt = "Select a player to view their properties"; 
    vector<string> playerNames{}; 
    for (Player p : players) 
    { 
     playerNames.push_back(p.getName()); 
    } 
    Menu propertiesMenuSelection{ prompt, playerNames }; 
    vector<Property> propertiesOfSelectedPlayer = players[propertiesMenuSelection.getChoice()].getOwnedProperties(); 
    sort(propertiesOfSelectedPlayer.begin(), propertiesOfSelectedPlayer.end(), propertySort); 

    system("CLS"); 

これは、ここではPropertyクラスは、ここで

#pragma once 
#include "Space.h" 
#include <array> 
#include <vector> 

extern std::vector<Player> players; 
class Property : public Space 
{ 
public: 
    Property(std::string name, std::vector<int> values); 
    ~Property(); 
    void run(Player&) override; 
    std::vector<std::string> boardOut() const override; 
    std::string getName() const override; 
    ... 
private: 
    std::string name; 
    int group; 
    int price; 
    int buildingCost; 
    int buildings; 
    Player* ownerPtr = nullptr; 
    std::array <int, 6> rent; 
    const std::array <std::string, 10> groups{ "Brown", "Light Blue", "Pink", "Orange", "Red", "Yellow", "Green", "Dark Blue", "Railroad", "Utility" }; 
}; 

だのに役立ちます非常に単純な要求に応じて空間クラスです。

#pragma once 
#include <string> 
#include <vector> 

class Player; 

class Space 
{ 
public: 
    virtual void run(Player&) = 0; 
    virtual std::string getName() const = 0; 
    virtual std::vector<std::string> boardOut() const = 0; 
}; 

enter image description here

+0

一部が割り当て可能ではありません。あなたのポストに 'スペース'を含めることができますか? –

+0

'私にエラーC2280'を与える - これは実行時エラーではなくコンパイラエラーであるため、問題のタイトルが示唆しているようにエラーは「スローされません」。 – PaulMcKenzie

+2

'const std :: array' - このメンバ変数は、コピーが利用できない理由かもしれません。 – PaulMcKenzie

答えて

2

削除機能は、代入演算子あります。 constメンバgroupsを割り当てることができないため、Propertyを割り当てることができません。これに対する最も論理的な解決策は、groupsstaticと宣言して、Propertyのすべてのインスタンスがそれを共有し、割り当てる必要がないようにすることです。例:

static const std::array <std::string, 10> groups; 

とストレージgroupsニーズが割り当てられ、クラス定義の外で初期化するために:

const std::array <std::string, 10> Property::groups{ "Brown", "Light Blue", "Pink", 
                "Orange", "Red", "Yellow", "Green", 
                "Dark Blue", "Railroad", "Utility" }; 

TL; DR

は、代入演算子のデフォルトの動作はすべてコピーすることですコピーにスマートを適用することなく、送信元のメンバーの送信先に送信することができます。これは本当に簡単な例

class test 
{ 
public: 
    const int a = 10; 
}; 

aconstで、変更がない場合でも、変更することはできないので、可能ではない

test& operator=(const test & src) 
{ 
    a = src.a; 
    return *this; 
} 

と同等のものを生成することを意味します。

独自の代入演算子

test& operator=(const test & src) 
{ 
    // deliberately does not assign a = src.a 
    return *this; 
} 

しかし、あなたは初期化時にaの値を変更することが可能な方法がない場合は、これがあるのでしょう唯一の理由を追加することができます。aを変更できない場合、testのすべてのインスタンスはaの同じ値を持ち、astaticのメンバーである可能性があります。 2つのtest Sはaに対して異なる値を有する障害の

例: `Property`または` Space`の

int main() 
{ 
    test a{11}; // a const variable cannot be changed after initialization, 
       // but this initializes a to 11. 
    test b;  // uses the default of 10 

    std::cout << a.a << ',' << b.a; // output 11,10 
    a = b; //this can't really be be done. a can never equal b 
} 
+0

パーフェクト!どのような素晴らしい説明。その静的な解決策は私が必要と実装したものです。多くの感謝! – Alex

+1

@Alex問題ありません。あなたを助けるには遅すぎるかもしれませんが、うまくいけば、この問題の次の人がそれを見つけるでしょう。 – user4581301

+0

私の考えは、他の人がこのエラーに遭遇した場合、あなたが並べ替えのようなものを使用していて、どこから出てきても非常に混乱する可能性があります。うまくいけば、彼らはあなたの答えを見て、この質問を見つけることができます。そして、おそらく彼らは非静的なconstの無制限の使用が危険な方法であることを理解するでしょう。これは私にとっても、うまくいけば他の人にとっても素晴らしいレッスンでした! – Alex

関連する問題